Funciones de conversión
# Funciones de conversión para crudo
## Metro cubico a barril (_p = precio, _q = cantidad)
conversor_m3bbl_p <- function(x) {x / 6.2898}
conversor_m3bbl_q <- function(x) {x * 6.2898}
# Funciones de conversión para gas
## Pies cúbico a metro cúbico
## 1ft³= 0.02831685m³
conversor_ft3m3_p <- function(x) {x / 0.02831685}
conversor_ft3m3_q <- function(x) {x * 0.02831685}
## Pie cúbico a Millón de BTU
# 1 ft3 = 0.001028 MM BTU
conversor_ft3MMBTU_q <- function(x) {x * 0.001028}
conversor_ft3MMBTU_p <- function(x) {x / 0.001028}
## Millón de BTU a metro cúbico
## 1 MM Btu = 27,8 m3 de gas (IAPG) ó 28.32861 m3 (Canada Energy Regulator)
conversor_MMBTUm3gas_p <- function(x) {x / 28.32861}
## m3 a MMBTU de gas
# 1 m3 = 0.0353 MM BTU (Canada Energy Regulator)
# otra opción 1 m3 = 34.121 MM BTU (BP)
conversor_m3MMBTU_q <- function(x){x * 0.0353}
conversor_m3MMBTU_p <- function(x){x / 0.0353}
## m3 a MMBTU (Alternativa, revisar)
# conversor_m3MMBTU_q <- function(x){x * 1/27.8}
# conversor_m3MMBTU_p <- function(x){x / 1/27.8}
## Conversión a BEP desde distintas medidas
conversor_m3bep_q <- function(x) {x * 5883}
conversor_MMBTUbep_q <- function(x) {x * 0.17245496} # BP
conversor_MMBTUbep_p <- function(x) {x / 0.17245496}
conversor_bepMMBTU_p <- function(x) {x / 5.798615}
Variables
Producción
Fuentes:
Producción de Crudo
La producción de petróleo crudo de largo plazo proviene del Anuario de Combustibles, de la cual contamos datos desde 1911 hasta 1992. Sus valores para el período 1980-1992 coinciden con los de EIA, por lo cual pueden usarse como fuentes alternativas. Asimismo, la evolución de SESCO es similar a la de EIA, salvo por pequeñas divergencias entre 2008 y 2013. La serie de Regalías presenta un nivel menor que las anteriores debido a las deducciones de producción que realizan las empresas para pagar un menor nivel de Regalías hacia las provincias donde realizan la producción. Por último, la serie del Ministerio de Economía coincide con Regalías en sus primeros años, luego presenta un nivel intermedio entre Regalías y SESCO y a partir de 2009 toma a SESCO como fuente. Salvo el Anuario de Combustibles, el resto de las series presentan datos hasta los últimos años. Por lo tanto, el criterio de selección para la serie de producción con la que se realizarán los cálculos es el siguiente:
- Criterio de cómputo para producicón de crudo:
- 1911 a 1992: Anuario de combustibles
- 1993 - actualidad: SESCO Downstream
Tabla 1. Producción de petróleo crudo en Argentina según distintas fuentes (barriles)
Producción de Gas Natural
Al igual que en la producción de petróleo crudo, la serie de largo plazo de producción de gas proviene del Anuario de Combustibles, de la cual contamos datos desde 1913 hasta 1992. A diferencia del crudo, sus valores para el período 1980-1992 no coinciden con los de EIA, pero está última sí coincide con los de Regalías entre 1999 y 2015. En cambio, la serie de SESCO, tiende a continuar la evolución de EIA y Regalías, pero con el nivel del Anuario de Combustibles, por lo que ambos pares de series pueden empalmar coherentemente según su nivel. Nuevamente, los valores de la base de Regalías son menores debido a las deducciones de producción para tributar menos regalías. La serie del Ministerio de Economía toma los valores de SESCO.Por lo tanto, el criterio de selección para la serie de producción de gas para los cálculos es el siguiente:
- Criterio de cómputo de la producción de gas:
- 1911 a 1992: Anuario de combustibles
- 1993 en adelante: SESCO Downstream
Tabla 2. Producción de gas natural en Argentina según distintas fuentes (MMBTU)
Produccion total
Joining, by = c("anio", "unidad")
Precio Mercado Interno
Fuentes:
- Base Ministerio de Hacienda, Informes Sectoriales
- Secretaría de Energía-Regalias
- Por ausencia de información, el precio de regalias entre 1993 y 1998 es el precio total (es decir, es un ponderado que incluye también el precio del mercado externo). En los años posteriores, dicho precio sí corresponde al del mercado interno.
- Kozulj y Pistonesi. Revista del Instituto de Economía Energética (IDEE) - Fundación Bariloche (1970 - 1988). Precio oficial interno de la cuenca neuquina a tasa de cambio oficial. Las fuentes utilizadas de esta revista son Secretaria de Energía, YPF, Gas del Estado, Boletin Informativo de Techint y series propias de IDEE
- Memoria Anual y balances contables de YPF (varios años). Precio intero promedio resultante de la relación entre ventas y cantidades producidas.
- Precios anuario. FALTA BUSCAR
ver de donde sacan el TCC cambiar precio del 92 por mecon estimado y valores restantes por estimado de idee
Precio Mercado Interno de Crudo
- Criterio para precio_crudo:
- 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
- 1989 a 1991: Anuario de YPF
- 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
- 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
- 1993 en adelante: MECON
Tabla 3. Precio del mercado interno del petróleo crudo en Argentina según distintas fuentes (barriles)
Precio Mercado Interno de Gas Natural
- Precio Mercado Interno de gas:
- 1963 - 1969 & 1989 - 1992: Anuario de YPF
- 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
- 1993 en adelante: Secretaría de Energía - Base Regalías
Tabla 4. Precio del mercado interno del gas natural en Argentina según distintas fuentes (barriles)
Precios de Referencia del Mercado Mundial
Precios de exportación desde Argentina, benchmarks y Precios del mercado de EEUU (solo gas, internos y de expo/impo)
- Secretaría de Energía-Regalias) (2006-hoy)
- MECON. Serie corta y sin transformaciones
- EIA
- Inflation Data (1946-hoy)
- Eurostat
- Revista IDEE
- Precio de Importación de gas natural desde Bolivia (1970-1988)
- UN Comtrade
- Precio de Exportación e Importación de gas y crudo (a Bolivia y promedio mundial)
- El precio impo bolivia de UN Comtrade cierra, da valores coherentes pero no deberia, dado que la conversión deberia realizarse multiplicando el precio en Mm3 por 1000 y ahí recién realizar la conversión
Precios de Referencia del Crudo
- Fuentes seleccionadas para precio_me_crudo:
- entre 1962 y 1992: precio de exportación argentina de UN Comtrade (clasificación SITC as reported)
- entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
- entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
- 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
- Valores faltantes previos a 1992 (1970 - 1985): Brent (Fuente: Inflation Data)
Falta construir una paridad de expo/impo con el flete
Precios de Referencia del Gas
- Criterio de precio_externo_gas:
- Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
- 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
- Datos faltantes para los años previos a 1963 y período 1968-1971
Exportación Argentina
Referencias mundiales
Bolivia
Todos los precios
buscamos un precio
cuanto es una cantidad de btu de gas al precio de referencia (ej bolivia) y cuanto es si convierto esos btu a barriles y los valorizo con el precio del barril? cuanto queda la unidad en btu si tomo el precio de petroleo y lo covierto a btu. es decir, cuanto es el valor si la valorizo en precio del petroleo
¿cuantos usd es un btu de petroleo? si tomo un barril de petroleo y lo convierto a btu ( me va a dar cuantos USD es un btu) luego comparo los USD/btu y lo comparo con el gas de bolivia
grinber: convierte todo el gas en petroleo y le pone el precio de petroeloe. subestima los precios del gas?
Exportaciones e Importaciones
Exportaciones e Importaciones de Crudo
- Exportaciones de Crudo:
- 1962 a 1993: UN Comtrade
- 1994 en adelante: SESCO Downstream
- Los datos faltantes de SESCO se completaron con MECON
- Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84
Exportaciones e Importaciones de Gas
- Fuentes seleccionadas:
- 1962 a 1996: UN Comtrade,
- 1997 en adelante: SESCO Downstream
- Datos faltantes para los años 1999 y 2000
Empleo, Remuneraciones y Masa Salarial (CCNN)
Pozos
Metros perforados
Fuente:
Pozos en operación
Fuentes:
- Secretaría de Energía - Datos MINEM:
- IAPG. Se presentan dos series: una elaborada a partir de los pozos perforados por año (resultante de descargar una base por cada año del sitio web oficial) y otra que corresponde al stock de pozos de petróleo de extracción efectiva (procedente de los datos de Estadísticas del Centenario de IAPG).
ver relaciones * PBI hidrocarburos / PBI total (ver cual elegir) * corregir nuestro VBP depurando servicios * MIP’s coef tecnico (para ver CI en el sector petrolero y peso del sector petrolero en PBI)
- stock petrolero / stock total JIC,EM
- Stock extraccion = PPyE PAE + PPyE Tecp + PPyE Petrobras upstr + Activo YPF upstream
- ver que porcentaje que representan estas empresas en la produccion o pozos y ver de ampliarlo
- ver relacion Activo YPF upstream / PPyE integrada YPF
- ver relacion ganancias AFIP y BOLSAR con el stock correspondiente (coherencia)
- ver relacion con Coremberg
- pasar ENGE
grinberg convertir lo nuestro a costos. agarrar nuestros valor y dividirlo por barriles (sumando gas en BOE) * costos por bbl, precio el barril y precio de produccion (sumo la gcia normal al costo1)
Activos
Pasar datos de bs de uso en yacimientos para armar relación activo yacimeinto/total
Fuentes:
Balances de Bolsar (unicamente empresas que cotizan en la bolsa de valores argentina). Revisar el stock del sector distribución porque se presenta demasiado grande con respecto al de los demás. Falta pasar los datos del activo de casi todas las empresas
AFIP. Con esta fuente no tenemos calculo de renta, sino que solo usamos la TG como parámetro. Nota: "_c" significa casos presentados de la variable correspondiente
Memorias de YPF. La década de los 80 presenta picos que hay que revisar
Calculo del Capital Total Adelantado (KTA)
- Bolsar: Es equivalente a la suma de Propiedad, Planta y Equipos Neta (descontando los terrenos y obras en curso) y los Inventarios. Cuando los datos lo habilitan, se le agregó los salarios adelantados (salarios y cargas consumidos sobre rotación). Luego, cuando no se presentaron datos de Propiedad, Planta y Equipos, se tomó el activo no corriente.
- AFIP: Es equivalente a la suma de Bienes de Uso, Bienes de Cambio, Inventarios y Disponibilidades.
- Memoria YPF: Suma de Bienes de Uso y Bienes de Cambio
Stock de segmentos de YPF y Petrobras
YPF largo plazo
Comparación entre la Memoria YPF (recopilado por BFR) y los balances extríados de Bolsar
Estimación de stock de capital a partir de la evolución de pozos perforados
El ejercicio consiste en verificar si los pozos terminados sirven como indicador de la inversión y, por lo tanto, de aproximador al stock de capital adelantado. Para ello se parte de un año base de la serie de Propiedad, Planta y Equipo del sector extracción de Bolsar y AFIP, para luego indexar las variables por la evolución de los pozos. Los balances de Bolsar que corresponden únicamente a extracción son dos: PAE y Tecpetrol, por lo que el valor obtenido puede estar subrepresentado para dar cuenta del total de la rama. Con respecto al índice de pozos, se tomaron dos series alternativas: una construída a partir del stock de pozos en extracción efectiva (fuente: IAPG) y otra elaborada con los pozos terminados anuales cargados por empresa operadora (fuente: Secretaría de Energía).
El año base elegido es 2006, dado que es el último dato que poseemos del stock de pozos totales en actividad de IAPG.
Se realizó la misma estimación para YPF, filtrando las variables de Propiedad, Planta y Equipo (para el total de la empresa, por lo que incluye no sólo extracción sino refinación y otros rubros) y activo total del upstream. Se utilizó únicamente el indice de pozos terminados anuales de YPF para estimar la PPyE y el activo, dado que no se posee valores del stock de pozos en perforación para los años en donde existen valores contables que sirvan de año base. Luego, se estimó un stock de capital total de rama a partir de ponderar el stock de YPF por la relación entre los pozos de YPF y los pozos totales de la rama.
En síntesis, el listado de variables estimadas- a partir de las dos series de pozos (stock y flujo),salvo para la estimación de YPF que solo se pudo hacer con flujo de pozos por ausencia de información- es las siguientes:
\(ppye\_estimado\_bolsar\) = \(PPyE\ año\ base\ de\ Bolsar\) * \(indice\ de\ pozos\)
\(ppye\_estimado\_afip\) = \(PPyE\ año\ base\ de\ AFIP\) * \(indice\ de\ pozos\)
\(ppye\_estimado\_ypf\) = \(PPyE\ año\ base\ de\ YPF\) * \(indice\ de\ pozos\ YPF\)
\(activo\_estimado\_upstream\_ypf\) = \(Activo\ año\ base\ de\ YPF\) * \(indice\ de\ pozos\ YPF\)
\(ppye\_estimado\_total\) = \(ppye\_estimado\_ypf\) * \[\frac{pozos\ totales}{pozos\ de\ YPF}\]
\(activo\_estimado\_upstream\) = \(activo\_estimado\_upstream\_ypf\) * \[\frac{pozos\ totales}{pozos\ de\ YPF}\]
Para poder seleccionar la estimación más adecuada, se realizó un análisis de correlación entre todas las series estimadas y los valores contables que se poseen de PPyE de AFIP, Bolsar e YPF. Se presentan distintos cuadros de correlaciones, con sus nivles de significancia, diagramas de dispersión entre variables y su distribución. Las series construídas que poseen mejor correlación son la Propiedad, Planta y Equipo a partir de Bolsar estimadas con índice de stock de pozos (correlación fuerte de 0.89 y significativa al 0.001) y flujo de pozos (correlación moderada de 0.54 y significativa al 0.05) y luego el activo del upstream total de la rama a partir de YPF (correlación moderada de 0.42 y significativa al 0.1 con los valores contables de YPF y correlación fuerte de 0.88 y significativa al 0.001 con las estimaciones de PPyE de AFIP y Bolsar a partir de flujo de pozos).
la estimación tiene que realizarse con PPyE porque hay que excluir salarios e inventarios (que están en KTA)
Análisis de correlacion entre Propiedad, Planta y Equipo y Pozos en producción
reemplazar ipc por un ibif o indice especifico
Total rama


ppye_afip ppye_bolsar pozos_iapg pozos_terminados pozos_cargados
ppye_afip 1.0000000 0.1743854 -0.2930975 -0.6054224 -0.3793896
ppye_bolsar 0.1743854 1.0000000 -0.4269400 -0.5803358 -0.3213849
pozos_iapg -0.2930975 -0.4269400 1.0000000 0.8924037 0.9611781
pozos_terminados -0.6054224 -0.5803358 0.8924037 1.0000000 0.8696256
pozos_cargados -0.3793896 -0.3213849 0.9611781 0.8696256 1.0000000

Joining, by = c("anio", "unidad")
Stock de pozos


ppye_afip ppye_bolsar pozos_iapg
ppye_afip 1.0000000 0.8382675 -0.9152596
ppye_bolsar 0.8382675 1.0000000 -0.9096424
pozos_iapg -0.9152596 -0.9096424 1.0000000

YPF
activo_upstream ppye_integrada pozos
activo_upstream 1.0000000 0.22492855 0.51192183
ppye_integrada 0.2249285 1.00000000 0.06456351
pozos 0.5119218 0.06456351 1.00000000




PPyE y activo upstream total rama a partir de YPF
`summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
Joining, by = "anio"
Joining, by = "anio"

Inversiones
Fuentes:
- Balances de Bolsar. Inversión calculada a partir de variaciones del activo + consumo de capital fijo (esto último está pendiente)
- Secretaria de Energía. Resolución 2057
- construir serie de inversión para atras (buscar Stock de YPF pero solo para extracción). armar ejercicio de FD y ver si las proporciones se mantienen.
Reconstruccion de serie de inversion por empresa ver un flujo de pozos y un flujo de inversion y luego ver si lo que mueve la inversion son los pozos (que su evolucion sea similar).
inversion por empresa (balance: variacion del activo + consumo de K fijo)
inversion por empresa (secretaria de energia)
inversion agregada (tipo de inversion) (cuentas nacionales?)
pozos nuevos por empresa por año
pozos nuevos totales
aplicar MIP para YPF
Inversión a partir de Balances
Inversión a partir de Secretaria de Energía
Análisis de correlación entre Inversión y Pozos
- buscar correlacion, para ver si la serie de inversión se mueve similar a los pozos
- usar stock y ademas usar variacion de stock (bs de uso)
Con pozos de IAPG
Con pozos Cap IV
Regalías
- Fuentes:
- Secretaría de Energía (Base Regalías)
REVISAR EL CALCULO DE BETANIA cuanto ganarian las provincias si el precio del mercado interno se acomoda al internacional?
Subsidios
Joining, by = "anio"
NAs introducidos por coerci昼㸳n
Valor total de la producción
Criterios metodológicos
Se presentan a continuación distintas estimaciones sobre la magnitud de riqueza presente en el sector hidrocarburífero: Valor Bruto y Agregado de Producción (VBP y VA), Consumo Interemedio (CI), Masa Salarial (MS) y Excedente Bruto de Explotación (EBE). El VBP surge de la valuación de la producción a sus precios correspondientes. El VA resulta de la diferencia entre el VBP y CI, el cual puede surgir originalmente de esta resta o a partir del coeficiente técnico de la Matriz Insumo Producto (MIP). El EBE constituye la plusvalía (PV) total de la rama, es decir, la suma de la renta de la tierra (RT) más la ganancia normal (Gnorm), y se obtiene luego de descontar la MS y los impuestos específicos (Imp) del VA. En todos los casos que se presentarán a continuación, los Imp se calcularon a partir de aplicar sobre el VBP un coeficiente resultante del peso de los impuestos promedio de la MIP de 1997. Lo mismo pasa con la estimación de la depreciación de capital o consumo de capital fijo (ConsKfijo), que se obtiene a partir de aplicar la tasa de depreciación promedio resultante de los balances de YPF (1998 - 2018) sobre el total de Propiedad, Planta y Equipo (PPyE) de la rama. Esta partida se aplica para obtener el Excedente Neto de Explotación. Se presentan distintas estimaciones para el VBP, CI y MS, que luego se observarán en la formulación matemática:
- CCNN (ccnn_oficial)
- Valores contables oficiales de las Cuentas Nacionales (sólo disponible para el período 2004-2012). Dado que se presentan series de VBP y VA, se pudo estimar el CI como la diferencia de dichas cuentas. Se procedió a separar el VBP a partir del peso del VBP de los servicios de apoyo a la extracción sobre el VBP de extracción de petróleo y gas, presente en el Cuadro de Utilización de Oferta (COU) de 2004 de INDEC. Se descontó esta proporción (resultante del 10,7%) del VBP total para obtener un VBP sólo de extracción. Dado que se posee información del salario promedio del sector y el empleo, se pudo obtener la MS resultante, tanto para el total del sector (extracción y servicios relacionados) como para sólo extracción. A partir de estos datos se elaboró un coeficiente que refleja el promedio de la proporción de la MS sobre el VBP que se utilizará en cálculos posteriores de MS total y MS de extracción.
- Estimación propia con criterio CCNN (vbp_va_ci_propia)
- Estimación propia de los valores contables a partir de las fuentes recopiladas, siguiendo los criterios de las Cuentas Nacionales. Es decir, para obtener el VBP se valua la producción destinada al mercado interno (resultante a partir de la diferencia entre producción y exportaciones) con los precios internos y las exportaciones con los precios de exportación, valuados tipo de cambio comercial (TCC). Se procedió también a separar el VBP de extracción neto de los servicios tal como se explicó anteriormente. El CI se estimó a partir de aplicar el coeficiente técnico (ratio CI/VBP) resultante de la MIP de 1997 (equivalente a 0.272). De igual manera, para calcular la masa salarial se aplicó el coeficiente de MS mencionado anteriormente. Finalmente, como se mencionó anteriormente, el VA el EBE se calcularon a partir de las diferencias mencionadas anteriormente.
- Empalme CCNN (vbp_ccnn)
- Estimación que toma los valores oficiales de las cuentas nacionales para el período donde se presentan datos (2004 -2012) y que imputa los valores faltantes por medio de la evolución del índice del VBP propio con criterio CCNN explicado anteriormente. Asimismo, se utilizaron los valores oficiales de la MS cuando se encontraba disponible el dato (1996-2018), mientras que se utilizó el valor propio estimado con criterio de las CCNN para los restantes años.
- Criterio Propio (pv_hidrocarburos_propia)
- Estimación propia que refleja con mayor precisión el valor de la riqueza total presente en el sector. El VBP se obtiene a paritr de valuar la totalidad de la producción a los precios externos o de referencia internacional y con el tipo de cambio de paridad (TCP), que mide la capacidad real de compra de la moneda nacional. Sin embargo, como el CI constituye intercambios de mercancías realizadas en el ámbito nacional, dicha partida se obtiene a partir de los valores obtenidos en la serie de empalme CCNN. De igual manera, se utilizó la MS resultante de esta última estimación.
Formulación matemática de estimaciones
Valor Bruto de Producción total, estimación con criterio propio \[VBP_{propia} = (Pext_{petróleo} * Q_{petróleo} + Pext_{gas} * Q_{gas}) * TCP\]
Donde:
- \(VBP_{propia}\) = Valor Bruto de la Producción total, estimación propia
- \(Pext_{petróleo}\) = Precio de exportación o referencia internacional del petróleo crudo (según corresponda)
- \(Pext_{gas}\) = Precio de exportación o referencia internacional del gas natural (según corresponda)
- \(Q_{petróleo}\) = Cantidades producidas totales de petróleo crudo
- \(Q_{gas}\) = Cantidades producidas totales de gas natural
- \(TCP\) = Tipo de Cambio de Paridad
Valor Bruto de Producción total, estimación con criterio CCNN \[VBP_{CCNN} = (Pint_{petróleo} * QMInt_{petróleo} + Pext_{petróleo} * Expo_{petróleo} + Pint_{gas} * QMInt_{gas} + Pext_{gas} * Expo_{gas})* TCC\]
Donde:
- \(VBP_{CCNN}\) = Valor Bruto de la Producción total, estimación propia con criterio de las CCNN
- \(Pint_{petróleo}\) = Precio mercado interno del petróleo crudo
- \(Pint_{gas}\) = Precio mercado interno del gas natural
- \(QMInt_{petróleo}\) = cantidades vendidas al mercado interno de petróleo crudo
- \(QMInt_{gas}\) = cantidades vendidas al mercado interno del gas natural
- \(Expo_{petróleo}\) = exportaciones de petróleo crudo
- \(Expo_{gas}\) = exportaciones de gas natural
- \(TCC\) = Tipo de Cambio Comercial
Valor Bruto de Producción extracción, estimación con criterio CCNN
\[VBP\_extr_{CCNN} = VBP_{CCNN} * (1-prop\_servicios)\]
Donde:
- \(VBP\_extr_{CCNN}\) = Valor Bruto de la Producción extracción, estimación propia con criterio de las CCNN
- \(prop\_extr\) = proporción del VBP de servicios de apoyo sobre VBP de extracción de petróleo y gas
Proporción de los servicios de apoyo sobre la extracción de petróleo y gas
\[prop\_servicios = \frac{VBP\_servicios_{COU}}{VBP\_extr_{COU} + VBP\_servicios_{COU}}\]
Donde:
- \(VBP\_servicios_{COU}\) = VBP de servicios de apoyo del Cuadro de Utilización de Oferta
- \(VBP\_extracción_{COU}\) = VBP de extracción de petróleo y gas del Cuadro de Utilización de Oferta
Consumo Intermedio, valores oficiales de las CCNN \[ CI_{CCNN} = VBP_{CCNN} - VA_{CCNN} \]
Donde:
- \(CI_{CCNN}\) = Consumo Intermedio total, estimación propia
- \(VA_{CCNN}\) = Valor Agregado, estimación de las CCNN
Consumo Intermedio, estimación con criterio CCNN \[ CI_{CCNN} = VBP_{CCNN} * Coef\_tec \] Donde:
- \(Coef\_tec\) = Coeficiente técnico de Matriz Insumo Producto
Consumo Intermedio de extracción, estimación con criterio CCNN
\[ CI\_extr_{CCNN} = VBP\_extr_{CCNN} * Coef\_tec \]
Donde:
- $ CI_extr_{CCNN}$ = Consumo Intermedio de extracción, estimación criterio CCNN
Masa Salarial, valores oficiales de las CCNN \[MS = W * Emp * 13\] Donde:
- \(MS\) = Masa Salarial
- \(W\) = Salario anual promedio
- \(Emp\) = Empleo
Masa Salarial, estimación con criterio CCNN \[MS = VBP_{CCNN} * Coef\_MS\]
Donde:
- \(Coef\_MS\) = Coeficiente de la proporción de MS sobre VBP
Masa Salarial de extracción, estimación con criterio CCNN \[MS\_extr = VBP\_extr_{CCNN} * Coef\_MS\]
Donde:
- \(MS\_extr\) = Masa salarial del sector extracción
Valor agregado, estimación criterio CCNN \[VA_{CCNN} = VBP_{CCNN} – CI_{CCNN} \] Donde:
- \(VA_{CCNN}\) = Valor Agregado, estimación propia con criterio CCNN
Valor agregado de extracción, estimación con criterio CCNN \[VA\_extr_{CCNN} = VBP\_extr_{CCNN} – CI\_extr_{CCNN} \]
Donde:
- \(VA\_extr_{CCNN}\) = Valor Agregado de extracción, estimación propia con criterio CCNN
Valor agregado, estimación con criterio propio \[VA_{propia} = VBP_{propia} – CI\_extr_{CCNN} \]
Donde:
- \(VA_{propia}\) = Valor Agregado, estimación con criterio propio
Excedente Bruto de Explotación, estimación con criterio CCNN \[EBE_{CCNN} = VA_{CCNN} – MS \]
Excedente Bruto de Explotación de extracción, estimación con criterio CCNN \[EBE\_extr_{CCNN} = VA\_extr_{CCNN} – MS\_extr \]
Excedente Bruto de Explotación, estimación con criterio propio \[EBE_{propia} = VA_{propia} – MS\_extr \]
Donde:
- \(EBE\) = Excedente Bruto de Explotación
- \(CI\_extr_{CCNN}\) = Consumo intermedio del sector extracción, estimación con criterio CCNN
Consumo de Capital Fijo, estimación con criterio propio \[ConKfijo = PPyE * prom(\frac{Dep}{PPyE}) \]
Donde:
- \(ConKfijo\) = Consumo de Capital Fijo
- \(PPyE\)= Propiedad, Planta y Equipo neta
- $prom() $ = tasa de depreciación promedio
- \(Dep\) = Depreciaciones (cuenta gastos por naturaleza)
Plusvalía (Excedente Neto de Explotación), estimación con criterio propio \[PV_{propia} = VA_{propia} - ConKfijo - Imp \]
Donde:
- \(PV_{propia}\) = Plusvalía (Excedente Neto de Explotación)
- \(Imp\) = Impuestos normales
Fuentes para la construcción de series
- Producción de Crudo:
- 1911 a 1992: Anuario de combustibles
- 1993 - actualidad: SESCO Downstream
- Exportaciones de Crudo:
- 1962 a 1993: UN Comtrade (clasificación SITC as reported)
- 1994 en adelante: SESCO Downstream
- Los datos faltantes de SESCO se completaron con MECON
- Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84
- Precio Mercado Interno de Crudo:
- 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
- 1989 a 1991: Anuario de YPF
- 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
- 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
- 1993 en adelante: MECON
- Precio Mercado Externo Crudo:
- entre 1962 y 1992: precio de exportación argentina de UN Comtrade
- entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
- entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
- 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
- Valores faltantes previos a 1992: Brent (Fuente: Inflation Data)
- Producción de Gas:
- 1911 a 1992: Anuario de combustibles
- 1993 en adelante: SESCO Downstream
- Exportaciones de gas:
- 1962 a 1996: UN Comtrade,
- 1997 en adelante: SESCO Downstream
- Datos faltantes para los años 1999 y 2000
- Precio Mercado Interno de gas:
- 1963 - 1969 & 1989 - 1992: Anuario de YPF
- 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
- 1993 en adelante: Secretaría de Energía - Base Regalías
- El dato del año 1992 se dividió por 10, dado que resultaba excesivamente alto, lo cual es metodológicamente inaceptable pero sirve de ejercicio.
- Precio Mercado Externo:
- Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
- 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
- Datos faltantes para los años previos a 1963 y período 1968-1971
- Valor Bruto de la Producción, Valor Agregado y Consumo Intermedio:
- INDEC - Dirección Nacional de Cuentas Nacionales (Base Minería e Hidrocarburos de las Cuentas Nacionales). Las variables “extraccion_y_servicios_hidrocarburos” refieren a “Extracción de petróleo crudo y gas natural. Actividades de servicios relacionadas con la extracción de petróleo y gas, excepto las actividades de prospección”
- Cálculo propio del VBP con datos datos de producción y precio internacional recopilados. Las fuentes son las siguientes (los criterios son los mismos para la utilización posterior en el cálculo de renta de la tierra hidrocarburífera por diferencial de precios, sobrevaluación cambiaria y otros mecanismos)
- Salario y empleo
- 1960-1996: estimación a partir de aplicación del coeficiente de proporción de la masa salarial sobre el VBP
- 1996 en adelante: Ministerio de Trabajo, Empleo y Seguridad Social - Observatorio de Empleo y Dinámica Empresarial (OEDE)
- Consumo de capital fijo
- Coeficiente de depreciación estimado a partir de Estados Contables de YPF (1998-2018)
Tasa de Ganancia
\[TG_{hidrocarburos} = \frac{PV_{hidrocarburífera}}{KTA_{hidrocarburífero}}\]
Por subsector
`summarise()` has grouped output by 'fecha'. You can override using the `.groups` argument.



##Total rama

Renta apropiada por las empresas de la rama
La renta apropiada por las empresas de la rama se calcula por medio del diferencial de tasas de ganancia entre el sector hidrocarburífero que surge a partir de los balances y la rentabilidad normal de la economía.
\[Renta\_empresas = KTA_{hidrocarburífero} * (TG_{hidrocarburífera} - TG_{referencia})\] \[TG_{hidrocarburífera} = \frac{Gcia_{hidrocarburos}}{KTA_{hidrocarburífero}}\] Por lo cual, la renta apropiada por las empresas de la rama sería equivalente a:
\[Renta\_empresas = Gcia_{hidrocarburos} - KTA_{hidrocarburífero} * TG_{referencia}\]
Donde:
- \(KTA_{hidrocarburífero}\) = Stock de capital adelantado de empresas hidrocarburíferas
- \(TG_{hidrocarburífera}\) = Tasa de ganancia de empresas hidrocarburíferas
- \(TG_{referencia}\) = Tasa de ganancia de referencia
- \(Gcia_{hidrocarburos}\) = Ganancia de empresas hidrocarburíferas
Joining, by = "anio"
Renta por el diferencial de precios entre el mercado interno y las referencias internacionales
Renta apropiada mediante el abaratamiento en el consumo interno por efecto del diferencial de precios interno/externo, sobrevaluación de la moneda y retenciones a la exportación
Criterio de cómputo de JK (variable ‘renta_dif_precios’)
\[RDP= ProdInt * Pext * TCP - ProdInt * PMI * TCC\]
Donde:
- \(RDP\) = Renta apropiada por efecto diferencial de precios interno/externo y sobrevaluación
- \(MdoInt\) = Producción destinada al Mercado Interno: Producción - Exportaciones - Existencias (barriles de petróleo ó MMBTU)
- \(Pext\) = Precio de referencia del mercado externo (USD)
- \(PMI\) = Precio de venta del mercado interno (USD)
- \(TCP\) = Tipo de Cambio de Paridad
- \(TCC\) = Tipo de Cambio Comercial
Criterio de cómputo de JIC y cia (variable ‘renta_abaratamiento_sobrevaluacion’)
\[RDP = MdoInt * PMI * (\frac{TCP}{TCC} - 1)\]


Renta apropiada por sobrevaluación cambiaria
\[Rsobrevaluacion = Expo * Pext * (TCP - TCC)\]
Donde: * \(Rsobrevaluacion\) = Renta apropiada por exportaciones con tipo de cambio sobrevaluado * \(Expo\) = Exportaciones (barriles de petróleo ó MMBTU) * \(Pext\) = Precio de referencia del mercado externo (USD) * \(TCP\) = Tipo de Cambio de Paridad * \(TCC\) = Tipo de Cambio Comercial
Joining, by = "anio"
Renta apropiada por consumidores y refinerías y procesadoras
Criterio de cómputo de Ramón (2019)
Refinerías y procesadoras
\[RR = (PI - PRMi) * CrudoP\]
- \(RR\) = Renta apropiada por las Refinadoras
- \(PI\) = promedio ponderado de Precios Internacionales
- \(PRMi\) = Precio ponderado a Refinerías del Mercado Interno
- \(CrudoP\) = barriles de Crudo Procesado por las refinadoras
Consumidores
\[RC = (PI - PRMi - MR) * CrudoP \]
- \(RC\) = Renta apropiada por los Consumidores
- \(MR\) = Margen de Refinerías
Esto resulta equivalente a plantear:
\[RC = PCMi * CrudoP\]
- \(PCMi\) = Precio ponderado a Consumidores del Mercado Interno.
Renta Hidrocarburífera Total. En precios constantes, sobre Plusvalía Total y PBI
Existen dos caminos para llegar al monto total de renta de la tierra hidrocarburífera: uno es descontando la ganancia normal de las empresas a la plusvalía total del sector y el otro es por medio de la suma de mecanismos de apropiación.
\[Renta\_hidrocarburífera = PV_{hidrocarburífera} - Gcia\_Normal_{hidrocarburífera}\] Donde:
- \(Gcia\_Normal_{hidrocarburífera}\) = Ganancia Normal del sector hidrocarburífero
- \(PV_{hidrocarburífera}\) = Plusvalía del sector hidrocarburífero
\[Gcia\_Normal_{hidrocarburífera} = KTA_{hidrocarburífero} * TG_{referencia}\]
Donde:
- \(KTA_{hidrocarburos}\) = Stock de capital adelantado del sector hidrocarburífero
- \(TG_{referencia}\) = Tasa de ganancia normal de referencia.
En este caso, seleccionamos la tasa de ganancia del sector industrial como parámetro para diferenciar la renta de la ganancia. A su vez, para el capital total adelantado de las empresas hidrocarburíferas, seleccionamos unicamente el valor resultante de la estimación de la PPyE de Bolsar a partir del indice de flujo de pozos (variable “ppye_bolsar_flujo”), por lo que le faltan los inventarios y salarios adelantados.
El cálculo de renta total hidrocarburífera que se obtiene por medio de descontar la ganancia normal a la plusvalía total del sector, debe ser igual a la renta obtenida por medio de la agregación de los distintos mecanismos de apropiación. Es decir:
\[Renta\_hidrocarburífera = Renta\_diferencial\_precios + Renta\_sobrevaluación + Renta\_empresas + Impuestos\_netos\_específicos \] \[Impuestos\_netos\_específicos = Retenciones + Regalías - Subsidios\]
Método directo (a partir de descuentos sobre el VBP)
Joining, by = "anio"
Joining, by = "anio"

Método indirecto (suma de mecanismos)
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
`mutate_all()` ignored the following grouping variables:
Column `anio`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
`mutate_all()` ignored the following grouping variables:
Column `anio`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Removed 21 rows containing missing values (position_stack).'big.mark' and 'decimal.mark' are both '.', which could be confusing
'big.mark' and 'decimal.mark' are both '.', which could be confusing

Costos
\[Q\_total = Q_{petróleo} + Q_{gas} \] Donde:
- \(Q\_total\) = Cantidades producidas de petróleo y gas en Barriles Equivalentes de Petróleo
- \(Q_{petróleo}\) = Cantidades producidas de petróleo crudo en barriles equivalentes de petróleo (BOE)
- \(Q_{gas}\) = Cantidades producidas de gas natural en barriles equivalentes de petróleo (BOE)
\[ Costos\_totales = CI + MS + ConKfijo\]
Donde:
- \(Costos\_totales\) = Costos totales hidrocarburíferos
- \(CI\) = Consumo Intermedio, distintas estimaciones
- \(MS\) = Masa Salarial, distintas estimaciones
- \(ConKfijo\) = Consumo de Capital Fijo
\[Costos\_totales\_con\_Gcia = Costos\_totales + Gcia\_Normal_{hidrocarburífera} \] Donde:
- \(Costos\_totales\_con\_Gcia\) = Costos totales hidrocarburíferos con ganancia normal
- \(Gcia\_Normal_{hidrocarburífera}\) = Ganancia normal del sector hidrocarburífero
\[ Precio\_costo = \frac{Costos\_totales}{Q\_total} \] Donde: * \(Precio\_costo\) = Precio de costo en BOE
A partir de esto se puede calcular un costo recuperable del petróleo y del gas
\[Costo\_crudo = Q_{petróleo} * Precio\_costo\] \[Costo\_gas = Q_{gas} * Precio\_costo\]
\[Precio\_produccion = \frac{Costos\_totales\_con\_Gcia}{Q\_total}\]
\[Precio\_vta\_potencial = \frac{Q\_total*Pext_{petróleo} - Costos\_totales}{Q\_total} \]
Donde: * \(Precio\_produccion\)= Precio de produccion * \(Precio_vta_potencial\) = Precio de venta potencial * \(Pext_{petróleo}\) = Precio de exportación/referencia internacional del petróleo crudo
Joining, by = "anio"
Joining, by = "anio"
Joining, by = c("anio", "ipc_18")
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = c("anio", "unidad")

Comparación con estimación de otros autores

'big.mark' and 'decimal.mark' are both '.', which could be confusing
Exportacion de resultados
LS0tDQp0aXRsZTogIlJlbnRhIGRlIGxhIHRpZXJyYSBoaWRyb2NhcmJ1csOtZmVyYSBlbiBBcmdlbnRpbmEgKDE5NjAgLSAyMDE4KSINCmF1dGhvcjoNCi0gYWZmaWxpYXRpb246IFVOR1MvQ09OSUNFVA0KICBuYW1lOiBNYXRlbyBTdXN0ZXIgeSBKdWFuIEtvcm5ibGlodHQNCm91dHB1dDoNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIGtlZXBfdGV4OiB5ZXMNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHllcw0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCi0tLQ0KDQo8YnI+DQo8YnI+DQoNCjxjZW50ZXI+IDxoMT48L2gxPiA8L2NlbnRlcj4gDQoNCg0KDQpgYGB7cn0NCiMgcGFyYSBndWFyZGFyIGdncGxvdCBjb24gdGFtYcOxbw0KIyBnZ3NhdmUoImZhY2V0X3dyYXBfY2hhcnQucG5nIiwgZmFjZXRfd3JhcF9jaGFydCwgd2lkdGggPSAxNjgwLzcyLCBoZWlnaHQgPSAxMDUwLzcyLCBkcGkgPSA3MikNCg0KYGBgDQoNCiAgDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBsaWJyYXJ5KHh0YWJsZSkgIyBlaiB4dGFibGUodGFibGEpIHBhcmEgcGFzYXIgYSBsYXRleA0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkNCg0KbGlicmFyeShyZWFkeGwpIA0KIyBsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoZnMpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoaHV4dGFibGUpICNyZXZpc2FyIGVzdG8gcGFyYSBkYXIgZm9ybWF0byBhbCBlamUgWQ0KIyBsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQ0KbGlicmFyeShIbWlzYykNCmxpYnJhcnkoem9vKQ0KDQpvcHRpb25zKHNjaXBlbiA9IDk5OTk5OTkpDQoNCiMgYWdyZWdhciBsYWJlbCBwYXJhIHZhcmlhYmxlcyBkZSBncmFmaWNvcyANCiNmYWNldHdyYXAofiBleHBlcmltZW50b3gsIGxhYmVsbGVyID0gYXNfbGFiZWxsZXIoZXhwX25hbWVzKSkrICANCg0KYGBgDQoNCiMgRnVuY2lvbmVzIGRlIGNvbnZlcnNpw7NuIA0KDQoqIFtDYW5hZGEg4oCTIE5hdGlvbmFsIEVuZXJneSBCb2FyZC4gRW5lcmd5IENvbnZlcnNpb24gVGFibGVzXShodHRwczovL2FwcHMuY2VyLXJlYy5nYy5jYS9Db252ZXJzaW9uL2NvbnZlcnNpb24tdGFibGVzLmFzcHg/R29DVGVtcGxhdGVDdWx0dXJlPWVuLUNBIzItMykNCiogW0JQXShodHRwczovL3d3dy5icC5jb20vY29udGVudC9kYW0vYnAvYnVzaW5lc3Mtc2l0ZXMvZW4vZ2xvYmFsL2NvcnBvcmF0ZS9wZGZzL2VuZXJneS1lY29ub21pY3Mvc3RhdGlzdGljYWwtcmV2aWV3L2JwLXN0YXRzLXJldmlldy0yMDE5LWFwcHJveGltYXRlLWNvbnZlcnNpb24tZmFjdG9ycy5wZGYpDQoqIFtFSUFdKGh0dHBzOi8vd3d3LmVpYS5nb3Yva2lkcy93aGF0LWlzLWVuZXJneS9lbmVyZ3ktY2FsY3VsYXRvcnMucGhwI25hdGdhc2NhbGMpDQoNCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBGdW5jaW9uZXMgZGUgY29udmVyc2nDs24gcGFyYSBjcnVkbw0KIyMgTWV0cm8gY3ViaWNvIGEgYmFycmlsIChfcCA9IHByZWNpbywgX3EgPSBjYW50aWRhZCkNCmNvbnZlcnNvcl9tM2JibF9wIDwtIGZ1bmN0aW9uKHgpIHt4IC8gNi4yODk4fQ0KY29udmVyc29yX20zYmJsX3EgPC0gZnVuY3Rpb24oeCkge3ggKiA2LjI4OTh9DQoNCiMgRnVuY2lvbmVzIGRlIGNvbnZlcnNpw7NuIHBhcmEgZ2FzDQojIyBQaWVzIGPDumJpY28gYSBtZXRybyBjw7piaWNvDQojIyAxZnTCsz0gMC4wMjgzMTY4NW3Csw0KY29udmVyc29yX2Z0M20zX3AgPC0gZnVuY3Rpb24oeCkge3ggLyAwLjAyODMxNjg1fQ0KY29udmVyc29yX2Z0M20zX3EgPC0gZnVuY3Rpb24oeCkge3ggKiAwLjAyODMxNjg1fQ0KDQojIyBQaWUgY8O6YmljbyBhIE1pbGzDs24gZGUgQlRVDQojIDEgZnQzID0gIDAuMDAxMDI4IE1NIEJUVQ0KY29udmVyc29yX2Z0M01NQlRVX3EgPC0gZnVuY3Rpb24oeCkge3ggKiAwLjAwMTAyOH0NCmNvbnZlcnNvcl9mdDNNTUJUVV9wIDwtIGZ1bmN0aW9uKHgpIHt4IC8gMC4wMDEwMjh9DQoNCiMjIE1pbGzDs24gZGUgQlRVIGEgbWV0cm8gY8O6Ymljbw0KIyMgMSBNTSBCdHUgPSAgMjcsOCBtMyBkZSBnYXMgKElBUEcpIMOzIDI4LjMyODYxIG0zIChDYW5hZGEgRW5lcmd5IFJlZ3VsYXRvcikgIA0KY29udmVyc29yX01NQlRVbTNnYXNfcCA8LSBmdW5jdGlvbih4KSB7eCAvIDI4LjMyODYxfQ0KICANCiMjIG0zIGEgIE1NQlRVIGRlIGdhcw0KIyAxIG0zID0gMC4wMzUzIE1NIEJUVSAgKENhbmFkYSBFbmVyZ3kgUmVndWxhdG9yKQ0KIyBvdHJhIG9wY2nDs24gMSBtMyA9IDM0LjEyMSBNTSBCVFUgIChCUCkNCmNvbnZlcnNvcl9tM01NQlRVX3EgPC0gZnVuY3Rpb24oeCl7eCAqIDAuMDM1M30NCmNvbnZlcnNvcl9tM01NQlRVX3AgPC0gZnVuY3Rpb24oeCl7eCAvIDAuMDM1M30NCg0KIyMgbTMgYSAgTU1CVFUgKEFsdGVybmF0aXZhLCByZXZpc2FyKQ0KIyBjb252ZXJzb3JfbTNNTUJUVV9xIDwtIGZ1bmN0aW9uKHgpe3ggKiAxLzI3Ljh9DQojIGNvbnZlcnNvcl9tM01NQlRVX3AgPC0gZnVuY3Rpb24oeCl7eCAvIDEvMjcuOH0NCg0KIyMgQ29udmVyc2nDs24gYSBCRVAgZGVzZGUgZGlzdGludGFzIG1lZGlkYXMNCmNvbnZlcnNvcl9tM2JlcF9xIDwtIGZ1bmN0aW9uKHgpIHt4ICogNTg4M30NCmNvbnZlcnNvcl9NTUJUVWJlcF9xIDwtIGZ1bmN0aW9uKHgpIHt4ICogMC4xNzI0NTQ5Nn0gIyBCUA0KY29udmVyc29yX01NQlRVYmVwX3AgPC0gZnVuY3Rpb24oeCkge3ggLyAwLjE3MjQ1NDk2fQ0KY29udmVyc29yX2JlcE1NQlRVX3AgPC0gZnVuY3Rpb24oeCkge3ggLyA1Ljc5ODYxNX0NCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIE90cmFzIGZ1bmNpb25lcw0KY2FtYmlvX3BvcmNlbnR1YWwgPC0gZnVuY3Rpb24oeCkge3gvbGFnKHgpIC0gMX0NCg0KZ2VuZXJhcl9pbmRpY2UgPC0gIGZ1bmN0aW9uKHNlcmllLGZlY2hhLCBmZWNoYV9iYXNlKXsNCiAgdmFsb3JfYmFzZSA8LSBzZXJpZVt3aGljaChmZWNoYT09ZmVjaGFfYmFzZSldDQogIGlmX2Vsc2Uoc2VyaWUgPT0gMCwgMCwgc2VyaWUvdmFsb3JfYmFzZSkNCn0NCg0KDQoNCnZhcmlhY2lvbl9pbnRlcmFudWFsIDwtIGZ1bmN0aW9uKHgpIHt4ICAtIGxhZyh4KX0NCg0KdGFzYV9jcmVjaW1pZW50byA8LSBmdW5jdGlvbih4KSB7KHggIC0gbGFnKHgpKS9sYWcoeCl9DQoNCg0KZ2VuZXJhcl9pbmRpY2UgPC0gIGZ1bmN0aW9uKHNlcmllLGZlY2hhLCBmZWNoYV9iYXNlKXsNCiAgdmFsb3JfYmFzZSA8LSBzZXJpZVt3aGljaChmZWNoYT09ZmVjaGFfYmFzZSldDQogIChzZXJpZS92YWxvcl9iYXNlKQ0KfQ0KDQoNCg0KIyBUYWJsYSBwYXJhIGNvbnZlcnRpciBsb3MgY2FtYmlvcyBkZSBtb25lZGENCmNvbnZlcnNvcl9wZXNvcyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL3Bhc2UgZGUgbW9uZWRhLnhsc3giKSAlPiUgDQogICMgbXV0YXRlKCJtJG4iID0gYXMuZG91YmxlKGNvbnZlcnNvcl9wZXNvcyRgbSRuYCkpICU+JSANCiAgbXV0YXRlX2FsbCguLCBhcy5kb3VibGUpICU+JSANCiAgbXV0YXRlKG1vbmVkYSA9IGMoIm1vbmVkYSBuYWNpb25hbCIsICJwZXNvcyBsZXkiLCAicGVzbyBhcmdlbnRpbm8iLCAiYXVzdHJhbCIsICJwZXNvcyIpKSAlPiUgDQogIGZpbHRlcihtb25lZGEgPT0gInBlc29zIikNCg0KYGBgDQoNCg0KDQoNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KDQojIERhdG9zIGF1eGlsaWFyZXMNCiMjUmV2aXN0YSBkZSBQb2zDrXRpY2EgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ8OtYQ0KIyMgR0FTDQojcHJlY2lvIHRyYW5zZmVyZW5jaWEsIHJlZ2FsaWFzLCBjb21wZW5zYWNpb25lcywgZXRjIGEgbm92aWVtYnJlIGRlIGNhZGEgYcOxbw0KY3VhZHJvXzQuMSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgZ2FzIG5hdHVyYWwgeSBkZXJpdmFkb3MgMTk3MCAtIDE5ODgueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDEpDQoNCiNwcmVjaW8gYm9saXZpYSB2cyBwcmVjaW9zIGludGVybm9zDQpjdWFkcm9fNC4zIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBnYXMgbmF0dXJhbCB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OC54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gMykgJT4lDQogIHJlbmFtZSh1bmlkYWRfZ2FzID0gInVuaWRhZCBnYXMiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfZ2FzID0gInBlc29zIGRlIDE5NzAvMTAwMCBtMyIgKQ0KDQojcHJlY2lvIGFkcXVpc2ljacOzbiBkZWwgRXN0YWRvIHkgdGFyaWZhIG1lZGlhIGRlIGdhcyBkaXN0cmlidWlkbw0KY3VhZHJvXzQuNCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgZ2FzIG5hdHVyYWwgeSBkZXJpdmFkb3MgMTk3MCAtIDE5ODgueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDQpDQpgYGANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyMgQ1JVRE8NCg0KIyBQcmVjaW9zIHBvciBjdWVuY2ENCmN1YWRyb18yLjIgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIHBldHJvbGVvIGNydWRvIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg5Lnhsc3giLCANCiAgICBza2lwID0gMCwgc2hlZXQgPSAyKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAicGVzb3MgZGUgMTk3MCIpDQoNCiNldm9sdWNpw7NuIGRlIHByZWNpb3MgcG9yIGN1ZW5jaWEgKGluZGljZXMgMTk3MCA9IDEwMCkNCmN1YWRyb18yLjMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIHBldHJvbGVvIGNydWRvIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg5Lnhsc3giLCANCiAgICBza2lwID0gMCwgc2hlZXQgPSAzKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIi4uLjEiKQ0KDQoNCiMgcHJlY2lvIHByb21lZGlvIHBhZ2FkbyBhIGNvbnRyYXRpc3RhcyBlbiBwZXNvcyB5IGRvbGFyZXMNCmN1YWRyb18yLjUgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIHBldHJvbGVvIGNydWRvIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg5Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSA1KQ0KDQojIHByZWNpb3MgcGFnYWRvcyBhIGNvbnRyYXRpc3RhcyB2cyBjb2JyYWRvcyBwb3IgcmVmaW5hZG9yYXMgcHJpdmFkYXMgKHByZWNpbyBjcnVkbyBuZXVxdWluYSkNCmN1YWRyb18yLjYgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIHBldHJvbGVvIGNydWRvIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg5Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSA2KSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAicGVzb3NfZGVfMTk3MF9tMyIpDQoNCiMgdmFsb3JlcyB1bml0YXJpb3MgZGVsIHByb2R1Y3RvIGNvbXB1ZXN0byBhIG5pdmVsIHByb2R1Y3RvcmVzIHkgY29uc3VtaWRvcmVzDQpjdWFkcm9fMi43IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gNykNCg0KYGBgDQogDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMjIyBUQ1AgDQp0Y3BfYW51YWwgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvVENQL3RjcF9hbnVhbC54bHN4IiwgDQogICAgY29sX3R5cGVzID0gYygibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiKSkgJT4lIA0KICByZW5hbWUoYW5pbyA9IGZlY2hhKQ0KDQp0Y3BfYW51YWxfYiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9UQ1AvdGNjX3RjcF9oaXN0b3JpY28ueGxzeCIpICU+JSANCiAgcmVuYW1lKHRjYyA9ICBgVENDIGV4cG9ydGFjaW9uZXNgLCBzb2JyZXZhbHVhY2lvbiA9IGBTb2JyZXZhbHVhY2nDs24gKFRDUC8gVENDKSAxOTUyLTE5NzI9MWAsDQogICAgICAgICB0Y3AgPSAiVENQIikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGNhc2Vfd2hlbihhbmlvID09IDQzMzEzIH4gMjAxOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGFuaW8pKSAlPiUgDQogIHNlbGVjdChhbmlvLCB0Y2MsIHRjcCwgc29icmV2YWx1YWNpb24pDQoNCiMgdGNfMzUwMCA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvVENQL2NvbTM1MDAueGxzIiwgc2tpcCA9IDMsIHNoZWV0ID0gMSkgJT4lIA0KIyAgIHNlbGVjdCgtIi4uLjMiKSAlPiUgDQojICAgbXV0YXRlKGFuaW8gPSB5ZWFyKEZlY2hhKSkgJT4lIA0KIyAgIGdyb3VwX2J5KGFuaW8pICU+JSANCiMgICBzdW1tYXJpc2UodGNjX2F2ZyA9IG1lYW4oYFRpcG8gZGUgQ2FtYmlvIGRlIFJlZmVyZW5jaWEgLSBlbiBQZXNvcyAtIHBvciBEw7NsYXJgKSkNCiMgd3JpdGUuY3N2KHRjXzM1MDAsICJyZXN1bHRhZG9zL2F1eGlsaWFyZXMvdGNfMzUwMC5jc3YiKQ0KDQp0Y2NfZGljXzYzIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL1RDUC90Y2NfZGljXzYzLnhsc3giKQ0KDQp0Y2NfbW9uZWRhX29yaWdpbmFsIDwtICB0Y2NfZGljXzYzICU+JSANCiAgc2VsZWN0KC11c2RfZGljKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYyApKSAlPiUgDQogIG11dGF0ZShtb25lZGEgPSBjYXNlX3doZW4oYW5pbyA9PSAxOTg0IH4gIiRhcmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBtb25lZGEpLA0KICAgICAgICAgIHRjY19tb25lZGEgPSBjYXNlX3doZW4oICNob21vZ2VuaXphbW9zIGxvcyBjYW1iaW9zIGRlIG1vbmVkYQ0KICAgICAgICAgICAgICAgICBtb25lZGEgPT0gIm0kbiIgfiB0Y2MqY29udmVyc29yX3Blc29zJGBtJG5gICwNCiAgICAgICAgICAgICAgICAgbW9uZWRhID09ICIkbGV5IiB+IHRjYypjb252ZXJzb3JfcGVzb3MkYCRMZXlgLCANCiAgICAgICAgICAgICAgICAgbW9uZWRhID09ICIkYXJnIiB+IHRjYypjb252ZXJzb3JfcGVzb3MkYCRhYCwgDQogICAgICAgICAgICAgICAgIG1vbmVkYSA9PSAiQSIgfiB0Y2MqY29udmVyc29yX3Blc29zJEEsDQogICAgICAgICAgICAgICAgIFQgfiB0Y2MpICkNCnRjY19tb25lZGFfb3JpZ2luYWwgIA0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMjIElQQw0KaXBjIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL2luZGljZXMvaXBjX21lbnN1YWxfMTk2M18yMDE4Lnhsc3giKSAlPiUgDQogIG11dGF0ZShhbmlvID0gem9vOjpuYS5sb2NmKGFuaW8pKSAlPiUgDQogIHJlbmFtZShpcGNfMDcwMyA9IGBCYXNlIDcvMjAwMyA9IDFgKSAlPiUgDQogIG11dGF0ZShmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlKGFuaW8sIG1lcywgc2VwID0gIi0iKSwgb3JkZXJzID0gInltIikpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgYW5pbywgbWVzICwgZXZlcnl0aGluZyguKSkNCg0KI2VzdGUgZXN0w6EgbWFsICANCiMgaXBjX3ZhcmlhY2lvbiA8LSAgaXBjICAlPiUgDQojICAgZmlsdGVyKG1lcyA9PSAxKSAlPiUgDQojICAgbXV0YXRlKGlwY192YXIgPSBjYW1iaW9fcG9yY2VudHVhbChpcGNfMDcwMyksDQojICAgICAgICAgIGlwY192YXI9IGNhc2Vfd2hlbihpcy5uYShpcGNfdmFyKSB+IDEsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gaXBjX3ZhciksDQojICAgICAgICAgICBpcGNfMDE2MiA9IGNhc2Vfd2hlbihhbmlvID09IDE5NjIgfiAxKSwNCiMgICAgICAgICAgaXBjXzAxNjIgPSBsYWcoaXBjXzAxNjIpK2xhZyhpcGNfMDE2MikqIGlwY192YXIpDQojICAgICAgICAgIA0KICAgICAgICAgIyBpcGNfMDE2MiA9IGxhZyhpcGNfMDE2MikgKyAobGFnKGlwY18wMTYyKSogaXBjX3ZhcikpDQogICAgICAgICAjIGlwY18wMTYyID0gY2FzZV93aGVuKCBpcy5uYShpcGNfMDE2MikgfiBsYWcoaXBjXzAxNjIpICsgbGFnKGlwY18wMTYyKSppcGNfdmFyICkpDQoNCg0KaXBjX3Byb21lZGlvIDwtIGlwYyAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoaXBjXzAzID0gbWVhbihpcGNfMDcwMykpICU+JSANCiAgbXV0YXRlKGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUoYW5pbyAsIG9yZGVycyA9ICJ5IikpLCANCiAgICAgICAgIGlwY183MCA9IGdlbmVyYXJfaW5kaWNlKHNlcmllID0gaXBjXzAzLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGE9IGZlY2hhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9iYXNlID0gIjE5NzAtMDEtMDEiKSwNCiAgICAgICAgIGlwY18xOCA9IGdlbmVyYXJfaW5kaWNlKHNlcmllID0gaXBjXzAzLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGE9IGZlY2hhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9iYXNlID0gIjIwMTgtMDEtMDEiKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGV2ZXJ5dGhpbmcoLikpDQoNCndyaXRlLmNzdihpcGNfcHJvbWVkaW8sIGZpbGUgPSAiQzovQXJjaGl2b3MvRGF0b3MvaW5kaWNlcy9pcGNfcHJvbWVkaW8uY3N2IikNCg0KIyBpcGNfNzAgPC0gaXBjX3ZhcmlhY2lvbiAlPiUgDQojICAgc2VsZWN0KGZlY2hhLCBpcGNfMDE3MCkgJT4lIA0KIyAgIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIA0KIyAgICAgICAgICAgICAgIHNlbGVjdChmZWNoYSwgaXBjXzcwKSkNCg0KIyBJUElNIGJhc2UgMTk5MyA9IDEwMA0KIyDDjW5kaWNlIGRlIHByZWNpb3MgaW50ZXJub3MgYWwgcG9yIG1heW9yIChJUElNKQ0KIyDDjW5kaWNlIGRlIHByZWNpb3MgaW50ZXJub3MgYsOhc2ljb3MgYWwgcG9yIG1heW9yIChJUElCKQ0KIyDDjW5kaWNlIGRlIHByZWNpb3MgYsOhc2ljb3MgZGVsIHByb2R1Y3RvciAoSVBQKQ0Kc2lwbV9zZXJpZTU2Xzk1IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0lOREVDL0lQSU0vc2lwbS1zZXJpZTU2LTk1LnhscyIsDQogICAgc2tpcCA9IDYpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBtZXMsDQogICAgICAgICBpcGltX25pdmVsX2dyYWwgPSBnZW5lcmFsLi4uMiAsDQogICAgICAgICBpcGltX25pdmVsX25hYyA9IG5hY2lvbmFsZXMuLi4zLA0KICAgICAgICAgaXBpbV9uaXZlbF9pbXBvID0gSW1wb3J0YWRvcywNCiAgICAgICAgIGlwaWJfbml2ZWxfZ3JhbCA9IGdlbmVyYWwuLi41ICwNCiAgICAgICAgIGlwaWJfbml2ZWxfbmFjID0gbmFjaW9uYWxlcy4uLjYsDQogICAgICAgICBpcGliX25pdmVsX2ltcG8gPSBpbXBvcnRhZG9zLA0KICAgICAgICAgaXBwX25pdmVsX2dyYWwgPSBnZW5lcmFsLi4uOCkgJT4lIA0KICBmaWx0ZXIoZ3JlcGwoICIxOSIsIGFuaW8pKSAlPiUgDQogIG11dGF0ZShhbmlvID0gYXMuZG91YmxlKGFuaW8pKQ0KDQppcGltX2Jhc2U5NCA8LSBzaXBtX3NlcmllNTZfOTUgJT4lIG11dGF0ZShpcGltX25pdmVsX2dyYWxfOTQgPSBnZW5lcmFyX2luZGljZShpcGltX25pdmVsX2dyYWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDE5OTQpKSAlPiUgDQogIHNlbGVjdChhbmlvLCBpcGltX25pdmVsX2dyYWwsIGlwaW1fbml2ZWxfZ3JhbF85NCkNCg0KIyBHYW5hbmNpYSB5IHBiaSBwZXNvcyBjb3JyaWVudGVzIChmdWVudGU6IEpJQy9FTSBjb250aW51YWNpb24gSklDKQ0KZ2FuYW5jaWFfeV9wYmkgPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvZ2FuYW5jaWEgeSBwYmkueGxzeCIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KDQpgYGANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBFc3RpbWFjaW9uIGRlIG90cm9zIGF1dG9yZXMNCiMgKipFc3RpbWFjacOzbiBKSyoqDQpyZW50YV9oaWRyb2NhcmJ1cm9zX2prIDwtIHJlYWRfZXhjZWwoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL3JlbnRhX2hpZHJvY2FyYnVyb3NfamsueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgZmlsdGVyKGluZGljZV90aWVtcG8gPD0gMjAxOSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICByZW5hbWUocHJlY2lvX21lX2dhcyA9IGBHYXMgbmF0dXJhbCBtZXJjYWRvIGV4dGVybm9gLA0KICAgICAgICAgcHJlY2lvX21pX2dhcyA9IGBwcmVjaW8gaW50ZXJubyBnYXMgbmF0dXJhbF9wZXNvc2AsDQogICAgICAgICBwcmVjaW9fbWVfY3J1ZG8gPSBgUHJlY2lvIGNydWRvIG1lcmNhZG8gZXh0ZXJub2AsDQogICAgICAgICBwcmVjaW9fbWlfY3J1ZG8gPSBgUHJlY2lvIGNydWRvIG1lcmNhZG8gaW50ZXJub2AsDQogICAgICAgICBwcmVjaW9fYm9saXZpYV9nYXNfdXNkID0gYEdhcyBOYXR1cmFsLiBQcmVjaW8gVmVudGEgQm9saXZpYSBhIEFyZ2VudGluYS4uLjI0YCwgDQogICAgICAgICBwcmVjaW9fYm9saXZpYV9nYXNfcGVzb3MgPSBgR2FzIE5hdHVyYWwuIFByZWNpbyBWZW50YSBCb2xpdmlhIGEgQXJnZW50aW5hLi4uMjVgLA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2NydWRvID1gUmVudGEgcG9yIHZlbnRhIGNydWRvIGVuIGVsIG1lcmNhZG8gaW50ZXJubyBwb3IgZGViYWpvIC8gYXJyaWJhIHByZWNpbyBpbnRlcm5hY2lvbmFsYCwNCiAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb19nYXMgPSAnUmVudGEgcG9yIHZlbnRhIGdhcyBlbiBlbCBtZXJjYWRvIGludGVybm8gcG9yIGRlYmFqbyAvIGFycmliYSBwcmVjaW8gaW50ZXJuYWNpb25hbCcsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyA9ICdSZW50YSBjcnVkbyBwb3IgZXhwb3J0YWNpb25lcyBhIHBlc28gc29icmV2YWx1YWRvJywNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyA9ICdSZW50YSBnYXMgcG9yIGV4cG9ydGFjaW9uZXMnLA0KICAgICAgICAgcmV0ZW5jaW9uZXMgPSAiUmV0ZW5jaW9uZXMiLA0KICAgICAgICAgcmVnYWxpYXMgPSBgUmVnYWxpYXMgdG90YWxgLA0KICAgICAgICAgcmVudGFfdG90YWwgPSAnU1VNQSByZW50YSBvdHJvcyAoc2luIGltcG9ydGFjaW9uZXMgbmkgcmV0ZW5jaW9uZXMpJykgJT4lIA0KICBtdXRhdGUodW5pZGFkX2dhcyA9ICJNTUJUVSIsDQogICAgICAgICB1bmlkYWRfY3J1ZG8gPSAiQmFycmlsZXMiLA0KICAgICAgICAgdW5pZGFkX3JlbnRhID0gIlBlc29zIGNvcnJpZW50ZXMiKSAlPiUgDQogIHNlbGVjdChhbmlvID0gaW5kaWNlX3RpZW1wbywgdW5pZGFkX2dhcywgdW5pZGFkX2NydWRvLCB1bmlkYWRfcmVudGEsDQogICAgICAgICBwcm9kX3BldGNydSwgZXhwb19jcnVkbywgY3J1ZG9faW50ZXJubywNCiAgICAgICAgIHByb2RfZ2FzbmF0LCBleHBvX2dhcywgZ2FzX2ludGVybm8sDQogICAgICAgICBwcmVjaW9fbWVfZ2FzICwgcHJlY2lvX21pX2dhcyAsIHByZWNpb19tZV9jcnVkbywgcHJlY2lvX21pX2NydWRvLCANCiAgICAgICAgIHByZWNpb19ib2xpdmlhX2dhc191c2QgLCAgcHJlY2lvX2JvbGl2aWFfZ2FzX3Blc29zICwgDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fY3J1ZG8gLCByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fZ2FzICwNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvICwgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzICwNCiAgICAgICAgIHJldGVuY2lvbmVzLCByZWdhbGlhcywgDQogICAgICAgICBUQ0MsIFRDUCwgDQogICAgICAgICByZW50YV90b3RhbCkgJT4lDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByb2RfcGV0Y3J1IiwgImV4cG9fY3J1ZG8iLCAiY3J1ZG9faW50ZXJubyIpLCANCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zYmJsX3EpICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYygicHJlY2lvX21pX2NydWRvIiwgInByZWNpb19tZV9jcnVkbyIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNiYmxfcCkgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcm9kX2dhc25hdCIsICJleHBvX2dhcyIsICJnYXNfaW50ZXJubyIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNNTUJUVV9xKSAlPiUgDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19taV9nYXMiLCAicHJlY2lvX2JvbGl2aWFfZ2FzX3Blc29zIiksDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM01NQlRVX3ApDQoNCiAgDQpyZW50YV9wcmVjaW9fZXhwb19jcnVkb19qayA8LSByZW50YV9oaWRyb2NhcmJ1cm9zX2prICU+JSANCiAgc2VsZWN0KGFuaW8sIHByb2RfcGV0Y3J1LCBleHBvX2NydWRvLCBjcnVkb19pbnRlcm5vLCANCiAgICAgICAgIHByZWNpb19taV9jcnVkbywgcHJlY2lvX21lX2NydWRvLCBUQ0MsIFRDUCwgDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fY3J1ZG8sIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvICkNCg0KDQpyZW50YV9wcmVjaW9fZXhwb19nYXNfamsgPC0gcmVudGFfaGlkcm9jYXJidXJvc19qayAlPiUgDQogIHNlbGVjdChhbmlvLCBwcm9kX2dhc25hdCwgZXhwb19nYXMsIGdhc19pbnRlcm5vLCANCiAgICAgICAgIHByZWNpb19taV9nYXMsIHByZWNpb19ib2xpdmlhX2dhc19wZXNvcywgVENDLCBUQ1AsIA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2dhcywgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzICkNCg0KDQojRXN0aW1hY2nDs24gQmlsbCB5IEZhcmZhcm8gUnVpeg0KcmVudGFfaGlkcm9jYXJidXJvc19mciA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9yZW50YV9oaWRyb2NhcmJ1cm9zX0ZSLnhsc3giICkgJT4lDQogIHNlbGVjdCgtdW5pZGFkKSAlPiUgDQogIHJlbmFtZShyZWdhbGlhcyA9ICJSZWdhbMOtYXMiLA0KICAgICAgICAgcmV0ZW5jaW9uZXMgPSBSZXRlbmNpb25lcywNCiAgICAgICAgIGV4cG9fdGMgPSAiTWVkaWFudGUgc29icmV2YWx1YWNpw7NuIHBhcmEgZXhwb3J0IiwNCiAgICAgICAgIGRpZl9wcmVjaW9zID0gIk1lZGlhbnRlIGRpZmVyZW5jaWEgcHJlY2lvIGludGVybm8gY29uIGludGVybmFjIikgJT4lDQogIGdyb3VwX2J5KGFuaW8gLCBpcGNfMDgpICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eCAvIDEwXjN9KSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgbXV0YXRlKHJlZ2FsaWFzID1yZWdhbGlhcyAqIGlwY18wOCAvaXBjXzE4LA0KICAgICAgICAgcmV0ZW5jaW9uZXMgPXJldGVuY2lvbmVzICogaXBjXzA4IC9pcGNfMTgsDQogICAgICAgICBleHBvX3RjID1leHBvX3RjICogaXBjXzA4IC9pcGNfMTgsDQogICAgICAgICBkaWZfcHJlY2lvcyA9ZGlmX3ByZWNpb3MgKiBpcGNfMDggL2lwY18xOCwNCiAgICAgICAgIHJlbnRhX3RvdGFsID0gcmVnYWxpYXMrIHJldGVuY2lvbmVzKyBleHBvX3RjKyBkaWZfcHJlY2lvcywNCiAgICAgICAgIHVuaWRhZCA9ICJtaWxsb25lcyBkZSBwZXNvcyAyMDE4IikgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoLWlwY18wOCkgDQpyZW50YV9oaWRyb2NhcmJ1cm9zX2ZyDQoNCiNvdHJvcyBhdXRvcmVzDQpyZW50YV9hdXRvcmVzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gY2FsY3VsbyByZW50YSBvdHJvcy9yZW50YV9hdXRvcmVzLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkNCg0KDQpgYGANCg0KDQojIFZhcmlhYmxlcw0KDQojIyBQcm9kdWNjacOzbg0KDQpGdWVudGVzOiANCg0KKiBbTWluaXN0ZXJpbyBkZSBIYWNpZW5kYSwgSW5mb3JtZXMNClNlY3RvcmlhbGVzXShodHRwczovL3d3dy5hcmdlbnRpbmEuZ29iLmFyL2Vjb25vbWlhL3BvbGl0aWNhZWNvbm9taWNhL3JlZ2lvbmFseXNlY3RvcmlhbC9pbmZvcm1lc3Byb2R1Y3Rpdm9zKSAoMTk5OC1ob3kpLiANCiogW1NlY3JldGFyw61hIGRlIEVuZXJnw61hIC0gUmVnYWxpYXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9yZWdhbGlhcy1kZS1wZXRyb2xlby1jcnVkby1nYXMtbmF0dXJhbC1nbHAtZ2Fzb2xpbmEteS1jb25kZW5zYWRvKSAoMTk5OC1ob3kpDQoqIFtTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAtIFNFU0NPIERvd25zdHJlYW1dKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9wcm9kdWNjaW9uLWRlLXBldHJvbGVvLXktZ2FzLXRhYmxhcy1kaW5hbWljYXMpKDE5OTMtaG95KQ0KKiBbQW51YXJpbyBkZSBjb21idXN0aWJsZXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9hbnVhcmlvcy1kZS1jb21idXN0aWJsZXMtMTk1MC0xOTk5KSAoMTkxMS0xOTkyKQ0KKiBLb3p1bGogeSBQaXN0b25lc2kuIFJldmlzdGEgIGRlbCBJbnN0aXR1dG8gZGUgRWNvbm9tw61hIEVuZXJnw6l0aWNhIChJREVFKSAtIEZ1bmRhY2nDs24gQmFyaWxvY2hlICAoMTk3MCAtIDE5ODgpDQoqIFtFSUFdKGh0dHBzOi8vd3d3LmVpYS5nb3YvaW50ZXJuYXRpb25hbC9kYXRhL2NvdW50cnkvQVJHL3BldHJvbGV1bS1hbmQtb3RoZXItbGlxdWlkcy9hbm51YWwtcGV0cm9sZXVtLWFuZC1vdGhlci1saXF1aWRzLXByb2R1Y3Rpb24/cGQ9NSZwPTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDB2ZyZ1PTAmZj1BJnY9bWFwYnViYmxlJmE9LSZpPW5vbmUmdm89dmFsdWUmJnQ9QyZnPW5vbmUmbD0yNDktLTYmcz05NDY5NDQwMDAwMCZlPTE1NDYzMDA4MDAwMDApICgxOTgwIC0gMjAxOSkNCg0KIyMjIFByb2R1Y2Npw7NuIGRlIENydWRvDQoNCg0KTGEgcHJvZHVjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvIGRlIGxhcmdvIHBsYXpvIHByb3ZpZW5lIGRlbCBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgZGUgbGEgY3VhbCBjb250YW1vcyBkYXRvcyBkZXNkZSAxOTExIGhhc3RhIDE5OTIuIFN1cyB2YWxvcmVzIHBhcmEgZWwgcGVyw61vZG8gMTk4MC0xOTkyIGNvaW5jaWRlbiBjb24gbG9zIGRlIEVJQSwgcG9yIGxvIGN1YWwgcHVlZGVuIHVzYXJzZSBjb21vIGZ1ZW50ZXMgYWx0ZXJuYXRpdmFzLiBBc2ltaXNtbywgbGEgZXZvbHVjacOzbiBkZSBTRVNDTyBlcyBzaW1pbGFyIGEgbGEgZGUgRUlBLCBzYWx2byBwb3IgcGVxdWXDsWFzIGRpdmVyZ2VuY2lhcyBlbnRyZSAyMDA4IHkgMjAxMy4gTGEgc2VyaWUgZGUgUmVnYWzDrWFzIHByZXNlbnRhIHVuIG5pdmVsIG1lbm9yIHF1ZSBsYXMgYW50ZXJpb3JlcyBkZWJpZG8gYSBsYXMgZGVkdWNjaW9uZXMgZGUgcHJvZHVjY2nDs24gcXVlIHJlYWxpemFuIGxhcyBlbXByZXNhcyBwYXJhIHBhZ2FyIHVuIG1lbm9yIG5pdmVsIGRlIFJlZ2Fsw61hcyBoYWNpYSBsYXMgcHJvdmluY2lhcyBkb25kZSByZWFsaXphbiBsYSBwcm9kdWNjacOzbi4gUG9yIMO6bHRpbW8sIGxhIHNlcmllIGRlbCBNaW5pc3RlcmlvIGRlIEVjb25vbcOtYSBjb2luY2lkZSBjb24gUmVnYWzDrWFzIGVuIHN1cyBwcmltZXJvcyBhw7FvcywgbHVlZ28gcHJlc2VudGEgdW4gbml2ZWwgaW50ZXJtZWRpbyBlbnRyZSBSZWdhbMOtYXMgeSBTRVNDTyB5IGEgcGFydGlyIGRlIDIwMDkgdG9tYSBhIFNFU0NPIGNvbW8gZnVlbnRlLiBTYWx2byBlbCBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgZWwgcmVzdG8gZGUgbGFzIHNlcmllcyBwcmVzZW50YW4gZGF0b3MgaGFzdGEgbG9zIMO6bHRpbW9zIGHDsW9zLiBQb3IgbG8gdGFudG8sIGVsIGNyaXRlcmlvIGRlIHNlbGVjY2nDs24gcGFyYSBsYSBzZXJpZSBkZSBwcm9kdWNjacOzbiBjb24gbGEgcXVlIHNlIHJlYWxpemFyw6FuIGxvcyBjw6FsY3Vsb3MgZXMgZWwgc2lndWllbnRlOg0KDQoqIENyaXRlcmlvIGRlIGPDs21wdXRvIHBhcmEgcHJvZHVjaWPDs24gZGUgY3J1ZG86IA0KICArIDE5MTEgYSAxOTkyOiBBbnVhcmlvIGRlIGNvbWJ1c3RpYmxlcyANCiAgKyAxOTkzIC0gYWN0dWFsaWRhZDogU0VTQ08gRG93bnN0cmVhbQ0KDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMgUFJPQ0VTQVIgRVNUQSBCQVNFDQptZWNvbl9oaWRyb2NhcmJ1cm9zX2RmIDwtICByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9oaWRyb2NhcmJ1cm9zLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoaW5kaWNlX3RpZW1wbyA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlZC8lbS8lWSIpKSwgDQogICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gIklTTy04ODU5LTEiKSkNCnVuaXF1ZShtZWNvbl9oaWRyb2NhcmJ1cm9zX2RmJGluZGljYWRvcikNCg0KYGBgDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0FudWFyaW8gZGUgY29tYnVzdGlibGVzDQpwcm9kX2FudWFyaW8gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qcm9kdWNjaW9uL1Byb2R1Y2Npb25fRGVzZGVfMTkxMSAtIGNvcGlhLnhscyIpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIsIGNydWRvX2FudWFyaW9fTW0zID0gIlBFVFJPTEVPIChNbTMpIiwgDQogIGdhc19oID0gYEdBUyBOQVRVUkFMIChNaWxsLiBtMylgLCBjYXJib25faCA9IGBDQVJCT04gKE1UbikgKCopYCkgJT4lIA0KICBtdXRhdGUoZ2FzX2FudWFyaW9fTU1tMyAgID0gYXMuZG91YmxlKGdhc19oKSwgDQogICAgICAgICBjYXJib25fYW51YXJpb19NdG4gICA9IGFzLmRvdWJsZShjYXJib25faCksDQogICAgICAgICBjcnVkb19hbnVhcmlvID0gY3J1ZG9fYW51YXJpb19NbTMgKiAxMDAwKSAlPiUgDQogIHNlbGVjdChhbmlvLCBjcnVkb19hbnVhcmlvLCBnYXNfYW51YXJpb19NTW0zLCBjYXJib25fYW51YXJpb19NdG4gKQ0KDQojIFJldmlzdGEgSURFRQ0KIyBQcm9kdWNjacOzbiBjcnVkbyBwb3IgYWRtaW5pc3RyYWNpw7NuIHkgY29udHJhdG9zDQpjdWFkcm9fMi4xIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gMSkgJT4lIA0KICByZW5hbWUodW5pZGFkID0gIi4uLjUiKQ0KDQojYmFzZSBNaW5pc3RlcmlvIGRlIEhhY2llbmRhDQpoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gPC0gIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lY29uL2RhdGFzZXRzIHZpZWpvcy9oaWRyb2NhcmJ1cm9zLmNzdiIsIA0KICAgIGxvY2FsZSA9IGxvY2FsZShkYXRlX25hbWVzID0gImVzIiwgZW5jb2RpbmcgPSAiSVNPLTg4NTktMSIpKSAlPiUgDQogIG11dGF0ZShmZWNoYSA9IGFzLkRhdGUobHVicmlkYXRlOjpwYXJzZV9kYXRlX3RpbWUoaW5kaWNlX3RpZW1wbywgb3JkZXJzID0gImRteSIpKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGV2ZXJ5dGhpbmcoLiksIC1jKDE6MywgZnVlbnRlLCBpbmRpY2VfdGllbXBvLGFsY2FuY2VfaWQpKQ0KDQojbGlzdGEgY29uIGluZGljYWRvcmVzDQpsaXN0YV9maWx0cm8gPC0gdW5pcXVlKGhpZHJvY2FyYnVyb3NfYmFzZV9tZWNvbiRpbmRpY2Fkb3IpDQoNCg0KcHJvZF9tZWNvbl9jcnVkbyA8LSBoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gJT4lIA0KICBmaWx0ZXIoIGluZGljYWRvciA9PSBsaXN0YV9maWx0cm9bM10sDQogICAgICAgICBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlID09ICJQZXRyw7NsZW8gY3J1ZG8iLA0KICAgICAgICAgZnJlY3VlbmNpYV9ub21icmUgPT0gIk1lbnN1YWwiKSAlPiUgIA0KICBtdXRhdGUoYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIGFjdGl2aWRhZF9wcm9kdWN0b19ub21icmUsIGluZGljYWRvciwgdW5pZGFkX2RlX21lZGlkYSkgJT4lIA0KICBzdW1tYXJpc2UoY3J1ZG9fbWVjb24gPSBzdW0odmFsb3IpKQ0KDQoNCiNCYXNlIHJlZ2FsaWFzDQpwcm9kX3JlZ2FsaWFzX2NydWRvIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmVnYWxpYXMvcHJvZHVjY2lvbl9jcnVkb19yZWdhbGlhcy5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJtMyIsDQogICAgICAgICBhbmlvID16b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBNRVMpLCBvcmRlcnMgPSAieW0iKSkpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBNRVMsIGFuaW8sIHVuaWRhZCwgIlRPVEFMIENVRU5DQSIsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgcmVuYW1lKHByb2RfY3J1ZG9fbTMgPSAiVE9UQUwgQ1VFTkNBIikgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQgKSAlPiUgDQogIHN1bW1hcmlzZShjcnVkb19yZWdhbGlhcyA9IHN1bShwcm9kX2NydWRvX20zKSkNCg0KI0Jhc2UgU0VTQ08gLmNzdiAgKFByZSAyMDA5KQ0KcHJvZF9zZXNjb19jcnVkb19hIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1NFU0NPL3Byb2R1Y2Npbi1kZS1wZXRybGVvLWFudGVyaW9yLWFsLTIwMDkuY3N2IikgJT4lDQogIHNlbGVjdChhbmlvLCBtZXMsaWRjb25jZXB0bywgY29uY2VwdG8sIENhbnRpZGFkICkgJT4lDQogIHJlbmFtZShjYW50aWRhZCA9IENhbnRpZGFkKSAlPiUNCiAgIyBmaWx0ZXIoIWlkY29uY2VwdG8gJWluJSBjKDQsIDUsIDcsIDgsIDkJKSkgJT4lDQogIGZpbHRlcihjb25jZXB0byAlaW4lIGMoIlByb2R1Y2Npw7NuIFByaW1hcmlhIChtMykiLCJQcm9kdWNjacOzbiBTZWN1bmRhcmlhIChtMykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9kdWNjacOzbiBwb3IgUmVjdXBlcmFjacOzbiBBaXNpc3RpZGEgKG0zKSIpKSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShjcnVkb19zZXNjbyA9IHN1bShjYW50aWRhZCwgbmEucm0gPSBUKSkgJT4lDQogIG11dGF0ZSh1bmlkYWQgPSAibTMiKQ0KDQojIEJhc2UgU0VTQ08gKFBvc3QgMjAwOSkNCnByb2Rfc2VzY29fY3J1ZG9fYiA8LSByZWFkX2NzdigNCiAgIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vcHJvZHVjY2luLWRlLXBldHJsZW8tcG9yLXlhY2ltaWVudG8uY3N2IikgJT4lIA0KICBzZWxlY3QoYW5pbywgbWVzLGlkY29uY2VwdG8sIGNvbmNlcHRvLCBjYW50aWRhZCApICU+JQ0KICAjIGZpbHRlcighaWRjb25jZXB0byAlaW4lIGMoNCwgNSwgNywgOCwgOQkpKSAlPiUNCiAgIyBmaWx0ZXIoaWRjb25jZXB0byAlaW4lIGMoMSwyLDMsIDYpKSU+JQ0KICAgIGZpbHRlcihjb25jZXB0byAlaW4lIGMoIlByb2R1Y2Npw7NuIFByaW1hcmlhIChtMykiLCJQcm9kdWNjacOzbiBTZWN1bmRhcmlhIChtMykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9kdWNjacOzbiBwb3IgUmVjdXBlcmFjacOzbiBBaXNpc3RpZGEgKG0zKSIpKSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShjcnVkb19zZXNjbyA9IHN1bShjYW50aWRhZCwgbmEucm0gPSBUKSkgJT4lDQogIG11dGF0ZSh1bmlkYWQgPSAibTMiKQ0KDQpwcm9kX3Nlc2NvX2NydWRvIDwtIHByb2Rfc2VzY29fY3J1ZG9fYSAlPiUgDQogIGJpbmRfcm93cyhwcm9kX3Nlc2NvX2NydWRvX2IpDQoNCiMgU0VTQ08gZGVzZGUgMTk1MA0KICANCnByb2Rfc2VjX2VuZXJnaWEgPC0gcmVhZC5jc3YoICIuLi9kYXRhL3NlY3JldGFyaWFfZW5lcmdpYS9zZXNjby9zZXJpZS1wcm9kdWNjaW9uLXBldHJvbGVvLXRvdGFsLXBhaXMtZGVzZGUtMTk1MC5jc3YiKSAlPiUgDQogIG11dGF0ZShwcm9kdWNjaW9uX3BldHJvbGVvID0gcHJvZHVjY2lvbl9wZXRyb2xlbyoxMDAwLA0KICAgICAgICAgdW5pZGFkID0gIm0zIikgJT4lIA0KICByZW5hbWUoY3J1ZG9fc2VjX2VuZXJnaWEgPSBwcm9kdWNjaW9uX3BldHJvbGVvKSANCg0KDQojRUlBDQoNCiN1bmlkYWQgb3JpZ2luYWwgPSBiYXJyZWxzIHBlciBkYXkNCg0KIyBUb3RhbCBQZXRyb2xldW0gYW5kIG90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbiA9IENydWRlIG9pbCwgTkdQTCwgYW5kIG90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbiArIFJlZmluZXJ5IHByb2Nlc3NpbmcgZ2Fpbg0KIyBDcnVkZSBvaWwsIE5HUEwsIGFuZCBvdGhlciBsaXF1aWRzIHByb2R1Y3Rpb24gPSBDcnVkZSBvaWwgaW5jbHVkaW5nIGxlYXNlIGNvbmRlbnNhdGUgcHJvZHVjdGlvbiArIE5hdHVyYWwgZ2FzIHBsYW50IGxpcXVpZHMgcHJvZHVjdGlvbiArIE90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbg0KDQpwcm9kX2VpYV9jcnVkbyA8LSAgcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL29pbF9wcm9kdWN0aW9uX2FyZy5jc3YiLCANCiAgICB0cmltX3dzID0gRkFMU0UsIHNraXAgPSAxKSAlPiUgDQogIGZpbHRlcighaXMubmEoQVBJKSkgJT4lIA0KICBzZWxlY3QoLUFQSSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9IGFuaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjpuY29sKC4pKSAlPiUgDQogIHNwcmVhZCguLA0KICAgICAgICAga2V5ID0gWDIsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKSAlPiUgDQogIHJlbmFtZSh0b3RhbF9vaWxfYW5kX290aGVyID0gYCAgICAgICAgVG90YWwgcGV0cm9sZXVtIGFuZCBvdGhlciBsaXF1aWRzIChNYi9kKWAsDQogICAgICAgICBjcnVkZV9vaWxfY29uZGVuc2F0ZSA9IGAgICAgICAgICAgICAgICAgQ3J1ZGUgb2lsIGluY2x1ZGluZyBsZWFzZSBjb25kZW5zYXRlIChNYi9kKWAsDQogICAgICAgICBuYXR1cmFsX2dhcyA9IGAgICAgICAgICAgICAgICAgTkdQTCAoTWIvZClgLA0KICAgICAgICAgb3RoZXJfbGlxdWlkcyA9IGAgICAgICAgICAgICAgICAgT3RoZXIgbGlxdWlkcyAoTWIvZClgLA0KICAgICAgICAgY3J1ZGVfb2lsX25ncGxfb3RoZXJfbGlxdWlkcyA9IGAgICAgICAgICAgICBDcnVkZSBvaWwsIE5HUEwsIGFuZCBvdGhlciBsaXF1aWRzIChNYi9kKWAsDQogICAgICAgICByZWZpbmVyeV9wcm9jZXNzaW5nX2dhaW4gPSBgICAgICAgICAgICAgUmVmaW5lcnkgcHJvY2Vzc2luZyBnYWluIChNYi9kKWApICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gKGMoImNydWRlX29pbF9jb25kZW5zYXRlIiwgIm5hdHVyYWxfZ2FzIiwgIm90aGVyX2xpcXVpZHMiLCANCiAgICAgICAgICAgICAgICAgICJjcnVkZV9vaWxfbmdwbF9vdGhlcl9saXF1aWRzIiwgInJlZmluZXJ5X3Byb2Nlc3NpbmdfZ2FpbiIgICwidG90YWxfb2lsX2FuZF9vdGhlciIpKSwNCiAgICAuZnVucyA9IGZ1bmN0aW9uKHgpIHt4ICogMzY1ICogMTAwMH0pICU+JSANCiAgbXV0YXRlKGFuaW8gPSBhcy5kb3VibGUoYW5pbyksDQogICAgICAgICB1bmlkYWQgPSAiYmFycmlsZXMiKQ0KDQojRUlBIGFsbCBkYXRhDQplaWFfYWxsX2RhdGEgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL2FyZ2VudGluYS9JTlQtRXhwb3J0LTA5LTE3LTIwMjBfMTEtMTUtMTYuY3N2IiwgDQogICAgc2tpcCA9IDEpDQoNCg0KIyBDb21wYXJhY2nDs24gZW50cmUgc2VyaWVzDQpwcm9kX21lcmdlX2NydWRvIDwtICBwcm9kX3JlZ2FsaWFzX2NydWRvICU+JSANCiAgbGVmdF9qb2luKHByb2RfbWVjb25fY3J1ZG8gICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNydWRvX21lY29uKSkgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGNydWRvX3JlZ2FsaWFzLCBjcnVkb19tZWNvbikgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9zZXNjb19jcnVkbykgJT4lIA0KICBmdWxsX2pvaW4ocHJvZF9hbnVhcmlvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNydWRvX2FudWFyaW8pICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKHVuaWRhZCA9ICJtMyIpKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX3NlY19lbmVyZ2lhLCBieSA9IGMoImFuaW8iLCAidW5pZGFkIikpICU+JSANCiAgIyBtdXRhdGUoZGlmID0gIGNydWRvX3JlZ2FsaWFzL2NydWRvX21lY29uLTEpICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYyggICAiY3J1ZG9fcmVnYWxpYXMiICwiY3J1ZG9fbWVjb24iLCAgIA0KICAgICAgICAgICAgICAgICAgICAgICAiY3J1ZG9fc2VzY28iLCAgICAiY3J1ZG9fYW51YXJpbyIsICJjcnVkb19zZWNfZW5lcmdpYSIgKSwgDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM2JibF9xKSAlPiUgIA0KICBsZWZ0X2pvaW4ocHJvZF9laWFfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgY3J1ZG9fZWlhID0gY3J1ZGVfb2lsX2NvbmRlbnNhdGUpKSAlPiUgDQogICBtdXRhdGUocHJvZF9jcnVkbyA9ICBjYXNlX3doZW4oYW5pbyA8IDE5NTAgfiBjcnVkb19hbnVhcmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTUwOjIwMTUgfmNydWRvX3NlY19lbmVyZ2lhICwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDIwMTUgfiBjcnVkb19zZXNjbyApLA0KICAgICAgICAgIHVuaWRhZCA9ICJiYXJyaWxlcyIsIA0KICAgICAgICAgIHZhcmlhYmxlID0gICJQcm9kdWNjacOzbiBkZSBjcnVkbyBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMiKSAgJT4lDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBzZWxlY3QoYW5pbywgdmFyaWFibGUsIHVuaWRhZCwgcHJvZF9jcnVkbywgZXZlcnl0aGluZyguKSkgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSBjcnVkb19yZWdhbGlhcywNCiAgICAgICAgIG1lY29uID0gY3J1ZG9fbWVjb24sDQogICAgICAgICBzZXNjbyA9IGNydWRvX3Nlc2NvLA0KICAgICAgICAgYW51YXJpb19jb21idXN0aWJsZXMgPSBjcnVkb19hbnVhcmlvLA0KICAgICAgICAgZWlhID0gY3J1ZG9fZWlhKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KDQojIHdyaXRlLmNzdihwcm9kX21lcmdlX2NydWRvLCBmaWxlID0gInJlc3VsdGFkb3MvcHJvZHVjY2lvbl9jcnVkby5jc3YiKQ0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByb2RfbWVyZ2VfY3J1ZG8sIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9wcm9kdWNjaW9uX2NydWRvLnhsc3giKQ0KDQojZGlmZXJlbmNpYSBwcm9tZWRpbyBkZWwgNiUgZW50cmUgbGFzIGJhc2VzIChlcyBtYXlvciBsYSBkZSBtZWNvbikNCiMgc3VtbWFyeShwcm9kX21lcmdlX2NydWRvKQ0KDQoNCiNFeGlzdGVuY2lhcw0KZXhpc3RlbmNpYXNfcGV0cm9sZW8gPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvZXhpc3RlbmNpYXNfY3J1ZG8ueGxzeCIpICU+JQ0KICBmaWx0ZXIoIShpcy5uYShleGlzdGVuY2lhcyApKSkgJT4lIA0KICByZW5hbWUoZXhpc3RlbmNpYXNfY3J1ZG8gPSBleGlzdGVuY2lhcykgJT4lIA0KICBtdXRhdGUoZXhpc3RlbmNpYXNfY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcShleGlzdGVuY2lhc19jcnVkbyksDQogICAgICAgICB1bmlkYWQgPSAiYmFycmlsZXMiKQ0KDQojIHBsb3QoZXhpc3RlbmNpYXNfcGV0cm9sZW8kYW5pbywgZXhpc3RlbmNpYXNfcGV0cm9sZW8kZXhpc3RlbmNpYXNfY3J1ZG8pDQoNCmBgYA0KDQo8YnI+DQoqKlRhYmxhIDEuIFByb2R1Y2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbyBlbiBBcmdlbnRpbmEgc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIChiYXJyaWxlcykqKg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnByb2RfbWVyZ2VfY3J1ZG8gJT4lIA0KICBzZWxlY3QoLXByb2RfY3J1ZG8pDQogDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90bHkocHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogIG11dGF0ZShyZWdhbGlhcyA9IGNhc2Vfd2hlbihyZWdhbGlhcyA9PSAwIH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmVnYWxpYXMpKSAlPiUNCiAgICBzZWxlY3QoLXByb2RfY3J1ZG8pICU+JSANCiAgZ2F0aGVyKGtleSA9IGZ1ZW50ZSwgdmFsdWUgPSB2YWxvciwgNDpuY29sKC4pKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZnVlbnRlKSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIDEuIFByb2R1Y2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkby4NCiAgICAgICAgQXJnZW50aW5hICgxOTExIC0gMjAyMCkiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgQmFycmlsZXMiLA0KICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBlbGFib3JhY2nDs24gcHJvcGlhIGVuIGJhc2UgYSBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgRUlBLCBNaW5pc3RlcmlvIGRlIEVjb25vbcOtYSwgU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgKEJhc2UgUmVnYWzDrWFzIHkgU0VTQ08pIikrDQogICMgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbih4KSBmb3JtYXQoeCwgYmlnLm1hcmsgPSAiLiIsIHNjaWVudGlmaWMgPSBGQUxTRSkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjp1bml0X2Zvcm1hdCh1bml0ID0iIiwgc2NhbGUgPSAxZS02KSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCiAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgDQpgYGANCg0KDQoNCiMjIyBQcm9kdWNjacOzbiBkZSBHYXMgTmF0dXJhbA0KDQpBbCBpZ3VhbCBxdWUgZW4gbGEgcHJvZHVjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvLCBsYSBzZXJpZSBkZSBsYXJnbyBwbGF6byBkZSBwcm9kdWNjacOzbiBkZSBnYXMgcHJvdmllbmUgZGVsIEFudWFyaW8gZGUgQ29tYnVzdGlibGVzLCBkZSBsYSBjdWFsIGNvbnRhbW9zIGRhdG9zIGRlc2RlIDE5MTMgaGFzdGEgMTk5Mi4gQSBkaWZlcmVuY2lhIGRlbCBjcnVkbywgc3VzIHZhbG9yZXMgcGFyYSBlbCBwZXLDrW9kbyAxOTgwLTE5OTIgbm8gY29pbmNpZGVuIGNvbiBsb3MgZGUgRUlBLCBwZXJvIGVzdMOhIMO6bHRpbWEgc8OtIGNvaW5jaWRlIGNvbiBsb3MgZGUgUmVnYWzDrWFzIGVudHJlIDE5OTkgeSAyMDE1LiBFbiBjYW1iaW8sIGxhIHNlcmllIGRlIFNFU0NPLCB0aWVuZGUgYSBjb250aW51YXIgbGEgZXZvbHVjacOzbiBkZSBFSUEgeSBSZWdhbMOtYXMsIHBlcm8gY29uIGVsIG5pdmVsIGRlbCBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgcG9yIGxvIHF1ZSBhbWJvcyBwYXJlcyBkZSBzZXJpZXMgcHVlZGVuIGVtcGFsbWFyIGNvaGVyZW50ZW1lbnRlIHNlZ8O6biBzdSBuaXZlbC4gTnVldmFtZW50ZSwgbG9zIHZhbG9yZXMgZGUgbGEgYmFzZSBkZSBSZWdhbMOtYXMgc29uIG1lbm9yZXMgZGViaWRvIGEgbGFzIGRlZHVjY2lvbmVzIGRlIHByb2R1Y2Npw7NuIHBhcmEgdHJpYnV0YXIgbWVub3MgcmVnYWzDrWFzLiBMYSBzZXJpZSBkZWwgTWluaXN0ZXJpbyBkZSBFY29ub23DrWEgdG9tYSBsb3MgdmFsb3JlcyBkZSBTRVNDTy5Qb3IgbG8gdGFudG8sIGVsIGNyaXRlcmlvIGRlIHNlbGVjY2nDs24gcGFyYSBsYSBzZXJpZSBkZSBwcm9kdWNjacOzbiBkZSBnYXMgcGFyYSBsb3MgY8OhbGN1bG9zIGVzIGVsIHNpZ3VpZW50ZToNCg0KKiBDcml0ZXJpbyBkZSBjw7NtcHV0byBkZSBsYSBwcm9kdWNjacOzbiBkZSBnYXM6DQogICsgMTkxMSBhIDE5OTI6IEFudWFyaW8gZGUgY29tYnVzdGlibGVzIA0KICArIDE5OTMgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNCYXNlIE1FQ09ODQpwcm9kX21lY29uX2dhcyA8LSBoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gJT4lIA0KICBmaWx0ZXIoaW5kaWNhZG9yID09IGxpc3RhX2ZpbHRyb1szXSwNCiAgICAgICAgIGFjdGl2aWRhZF9wcm9kdWN0b19ub21icmUgPT0gIkdhcyBuYXR1cmFsIiwNCiAgICAgICAgIGZyZWN1ZW5jaWFfbm9tYnJlID09ICJNZW5zdWFsIikgJT4lICANCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKGZlY2hhKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlLCBpbmRpY2Fkb3IsIHVuaWRhZF9kZV9tZWRpZGEpICU+JSANCiAgc3VtbWFyaXNlKGdhc19tZWNvbiA9IHN1bSh2YWxvcikpDQoNCiNCYXNlIHJlZ2FsaWFzDQpwcm9kX3JlZ2FsaWFzX2dhcyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3Byb2R1Y2Npb25fZ2FzX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw5FPIikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIiwNCiAgICAgICAgIGFuaW8gPSB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBNRVMpLCBvcmRlcnMgPSAieW0iKSkpICU+JSANCiAgc2VsZWN0KGZlY2hhLCB1bmlkYWQsICJUT1RBTCBDVUVOQ0EiLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIHJlbmFtZShwcm9kX2dhc19NbTMgPSAiVE9UQUwgQ1VFTkNBIikgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQgKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIHN1bW1hcmlzZShnYXNfcmVnYWxpYXMgPSBzdW0ocHJvZF9nYXNfTW0zKSkNCg0KI0Jhc2UgU0VTQ08NCiNwcmUgMjAwOQ0KcHJvZF9zZXNjb19nYXNfYSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9wcm9kdWNjaW4tZGUtZ2FzLWFudGVyaW9yLWFsLTIwMDkuY3N2IikgICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcyxpZGNvbmNlcHRvLCBjb25jZXB0bywgQ2FudGlkYWQgKSAlPiUNCiAgcmVuYW1lKGNhbnRpZGFkID0gQ2FudGlkYWQpICU+JQ0KICBmaWx0ZXIoaWRjb25jZXB0byAhPSA0KSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShnYXNfc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KI3Bvc3QgMjAwOQ0KcHJvZF9zZXNjb19nYXNfYiA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9wcm9kdWNjaW4tZGUtZ2FzLXBvci15YWNpbWllbnRvLmNzdiIpICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcyxpZGNvbmNlcHRvLCBjb25jZXB0bywgY2FudGlkYWQgKSAlPiUNCiAgZmlsdGVyKGlkY29uY2VwdG8gJWluJSBjKDEsMiwzKSklPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShnYXNfc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KcHJvZF9zZXNjb19nYXMgPC0gcHJvZF9zZXNjb19nYXNfYSAlPiUNCiAgYmluZF9yb3dzKHByb2Rfc2VzY29fZ2FzX2IpDQoNCg0KI0VJQQ0KcHJvZF9laWFfZHJ5X25hdHVyYWxfZ2FzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9FSUEvZGF0YS9EcnlfbmF0dXJhbF9nYXNfcHJvZHVjdGlvbl9BcmdlbnRpbmFfQW5udWFsLmNzdiIsIA0KICAgIHNraXAgPSA0KSAgJT4lIA0KICByZW5hbWUoYW5pbyA9IFllYXIsDQogICAgICAgICBwcm9kX2VpYSA9IGBTZXJpZXMgSUQ6IElOVEwuMjYtMS1BUkctQkNGLkEgYmlsbGlvbiBjdWJpYyBmZWV0YCkgJT4lIA0KICBtdXRhdGUocHJvZF9laWEgPSBjb252ZXJzb3JfZnQzbTNfcShwcm9kX2VpYSAqIDEwMDAwMDApLA0KICAgICAgICAgdW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KDQojIENvbXBhcmFjacOzbiBlbnRyZSBzZXJpZXMNCnByb2RfbWVyZ2VfZ2FzIDwtICBwcm9kX3JlZ2FsaWFzX2dhcyAlPiUgDQogIGxlZnRfam9pbihwcm9kX21lY29uX2dhcyAgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZ2FzX21lY29uKSkgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGdhc19yZWdhbGlhcywgZ2FzX21lY29uKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX3Nlc2NvX2dhcykgJT4lICANCiAgZnVsbF9qb2luKHByb2RfYW51YXJpbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBnYXNfYW51YXJpbyA9IGdhc19hbnVhcmlvX01NbTMgKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShnYXNfYW51YXJpbyA9IGdhc19hbnVhcmlvICogMTAwMCwNCiAgICAgICAgICAgICAgICAgICAgIHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIpKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX2VpYV9kcnlfbmF0dXJhbF9nYXMgJT4lIHJlbmFtZShnYXNfZWlhID0gcHJvZF9laWEpKSAlPiUgDQogIG11dGF0ZShwcm9kX2dhcyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5MyB+IGdhc19hbnVhcmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAxOTkyIH4gZ2FzX3Nlc2NvKSwNCiAgICAgICAgICB2YXJpYWJsZSA9ICAiUHJvZHVjY2nDs24gZGUgZ2FzIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyIpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIHNlbGVjdChhbmlvLCB2YXJpYWJsZSwgdW5pZGFkLCBwcm9kX2dhcywgZXZlcnl0aGluZyguKSkgJT4lIA0KICAgZmlsdGVyKCFpcy5uYShwcm9kX2dhcykpICU+JSANCiAgcmVuYW1lKHJlZ2FsaWFzID0gZ2FzX3JlZ2FsaWFzLA0KICAgICAgICAgbWVjb24gPSBnYXNfbWVjb24sDQogICAgICAgICBzZXNjbyA9IGdhc19zZXNjbywNCiAgICAgICAgIGFudWFyaW9fY29tYnVzdGlibGVzID1nYXNfYW51YXJpbywNCiAgICAgICAgIGVpYSA9IGdhc19laWEpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAyMDIxKQ0KDQoNCiMgd3JpdGUuY3N2KHByb2RfbWVyZ2VfZ2FzLCBmaWxlID0gInJlc3VsdGFkb3MvcHJvZHVjY2lvbl9nYXMuY3N2IikNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcm9kX21lcmdlX2dhcywgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL3Byb2R1Y2Npb25fZ2FzLnhsc3giKQ0KDQojZGlmZXJlbmNpYSBwcm9tZWRpbyBkZWwgMTQlIGVudHJlIGxhcyBiYXNlcyAoZXMgbWF5b3IgbGEgZGUgbWVjb24pDQojIHN1bW1hcnkocHJvZF9tZXJnZV9nYXMpDQoNCnByb2RfbWVyZ2VfZ2FzX01NQlRVIDwtIHByb2RfbWVyZ2VfZ2FzICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdmFyaWFibGUsIHVuaWRhZCkgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfbTNNTUJUVV9xKHgqMTAwMCl9KSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTU1CVFUiKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCiAgDQpwcm9kX21lcmdlX2dhc19iZXAgPC0gcHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICBncm91cF9ieShhbmlvLCB2YXJpYWJsZSwgdW5pZGFkKSAlPiUgDQogIG11dGF0ZV9hbGwoY29udmVyc29yX01NQlRVYmVwX3EpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJCRVAiKQ0KICANCiMgd3JpdGUuY3N2KHByb2RfbWVyZ2VfZ2FzX2JlcCwgZmlsZSA9ICJyZXN1bHRhZG9zL3Byb2RfbWVyZ2VfZ2FzX2JlcC5jc3YiKQ0KYGBgDQoNCjxicj4NCioqVGFibGEgMi4gUHJvZHVjY2nDs24gZGUgZ2FzIG5hdHVyYWwgZW4gQXJnZW50aW5hIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyAoTU1CVFUpKioNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcm9kX21lcmdlX2dhc19NTUJUVSAlPiUgDQogIHNlbGVjdCgtcHJvZF9nYXMpDQoNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdGx5KHByb2RfbWVyZ2VfZ2FzX01NQlRVICU+JSANCiAgICAgICAgICAgc2VsZWN0KC1wcm9kX2dhcykgJT4lDQogIG11dGF0ZShyZWdhbGlhcyA9IGNhc2Vfd2hlbihyZWdhbGlhcyA9PSAwIH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmVnYWxpYXMpKSAlPiUgDQogIGdhdGhlcihrZXkgPSBmdWVudGUsIHZhbHVlID0gdmFsb3IsIDQ6bmNvbCguKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGZ1ZW50ZSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyAyLiBQcm9kdWNjacOzbiBkZSBnYXMuDQogICAgICAgIEFyZ2VudGluYSAoMTkxMyAtIDIwMjApIiwNCiAgICAgICB5ID0gIk1NQlRVIiwNCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogZWxhYm9yYWNpw7NuIHByb3BpYSBlbiBiYXNlIGEgQW51YXJpbyBkZSBDb21idXN0aWJsZXMsIEVJQSwgTWluaXN0ZXJpbyBkZSBFY29ub23DrWEsIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIChCYXNlIFJlZ2Fsw61hcyB5IFNFU0NPKSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQojIyMgUHJvZHVjY2lvbiB0b3RhbA0KYGBge3J9DQpwcm9kdWNjaW9uX3RvdGFsIDwtIHByb2RfbWVyZ2VfZ2FzX2JlcCAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQscHJvZF9nYXMpICU+JQ0KICBsZWZ0X2pvaW4ocHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQscHJvZF9jcnVkbykgJT4lICBtdXRhdGUodW5pZGFkID0iQkVQIikgKSAlPiUgDQogIG11dGF0ZShwcm9kdWNjaW9uX3RvdGFsX2JlcCA9IHByb2RfY3J1ZG8gKyBwcm9kX2dhcykNCg0KcHJvZHVjY2lvbl90b3RhbA0KYGBgDQoNCg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIyBDcnVkbyBwcm9jZXNhZG8NCg0KYGBgDQoNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyMgVmVudGFzDQogIyBDcnVkbyB5IEdhcw0KDQojICogW1NFU0NPIC0gUmVmaW5hY2nDs24geSBDb21lcmNpYWxpemFjacOzbiBkZSBwZXRyw7NsZW8sIGdhcyB5IGRlcml2YWRvc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3JlZmluYWNpb24teS1jb21lcmNpYWxpemFjaW9uLWRlLXBldHJvbGVvLWdhcy15LWRlcml2YWRvcy10YWJsYXMtZGluYW1pY2FzKQ0KIyANCiMgIERhdG9zIGRlIGNhbnRpZGFkZXMNCiMgIA0KI2NvbXByYXMgZW1wcmVzYXMgZGVsIHNlY3Rvcg0KY29tcHJhcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9SZWZpbmFjacOzbiB5IGNvbWVyY2lhbGl6YWNpb24vY29tcHJhcy5jc3YiKQ0KDQojdmVudGFzIG1kbyBpbnRlcm5vLiBjYW50aWRhZGVzLiBwb3N0IDIwMTANCnZlbnRhc19tZXJjYWRvX3Byb2R1Y3RvX2VtcHJlc2EgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vUmVmaW5hY2nDs24geSBjb21lcmNpYWxpemFjaW9uL3ZlbnRhcy1tZXJjYWRvLXByb2R1Y3RvLWVtcHJlc2EuY3N2IiwgDQogICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gIklTTy04ODU5LTEiKSkNCg0KI3ZlbnRhcyBtZG8gaW50ZXJuby4gY2FudGlkYWRlcy4gcG9zdCAyMDEwDQp2ZW50YXNfYV9lbXByZXNhc19kZWxfc2VjdG9yIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1NFU0NPL1JlZmluYWNpw7NuIHkgY29tZXJjaWFsaXphY2lvbi92ZW50YXMtYS1lbXByZXNhcy1kZWwtc2VjdG9yLmNzdiIpDQoNCmBgYA0KDQoNCiMjIFByZWNpbyBNZXJjYWRvIEludGVybm8NCg0KRnVlbnRlczogDQoNCiogW0Jhc2UgTWluaXN0ZXJpbyBkZSBIYWNpZW5kYSwgSW5mb3JtZXMNClNlY3RvcmlhbGVzXShodHRwczovL3d3dy5hcmdlbnRpbmEuZ29iLmFyL2Vjb25vbWlhL3BvbGl0aWNhZWNvbm9taWNhL3JlZ2lvbmFseXNlY3RvcmlhbC9pbmZvcm1lc3Byb2R1Y3Rpdm9zKQ0KKiBbU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEtUmVnYWxpYXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9yZWdhbGlhcy1kZS1wZXRyb2xlby1jcnVkby1nYXMtbmF0dXJhbC1nbHAtZ2Fzb2xpbmEteS1jb25kZW5zYWRvKQ0KICArIFBvciBhdXNlbmNpYSBkZSBpbmZvcm1hY2nDs24sIGVsIHByZWNpbyBkZSByZWdhbGlhcyBlbnRyZSAxOTkzIHkgMTk5OCBlcyBlbCBwcmVjaW8gdG90YWwgKGVzIGRlY2lyLCBlcyB1biBwb25kZXJhZG8gcXVlIGluY2x1eWUgdGFtYmnDqW4gZWwgcHJlY2lvIGRlbCBtZXJjYWRvIGV4dGVybm8pLiBFbiBsb3MgYcOxb3MgcG9zdGVyaW9yZXMsIGRpY2hvIHByZWNpbyBzw60gY29ycmVzcG9uZGUgYWwgZGVsIG1lcmNhZG8gaW50ZXJuby4gIA0KKiBLb3p1bGogeSBQaXN0b25lc2kuIFJldmlzdGEgIGRlbCBJbnN0aXR1dG8gZGUgRWNvbm9tw61hIEVuZXJnw6l0aWNhIChJREVFKSAtIEZ1bmRhY2nDs24gQmFyaWxvY2hlICAoMTk3MCAtIDE5ODgpLiBQcmVjaW8gb2ZpY2lhbCBpbnRlcm5vIGRlIGxhIGN1ZW5jYSBuZXVxdWluYSBhIHRhc2EgZGUgY2FtYmlvIG9maWNpYWwuIExhcyBmdWVudGVzIHV0aWxpemFkYXMgZGUgZXN0YSByZXZpc3RhIHNvbiBTZWNyZXRhcmlhIGRlIEVuZXJnw61hLCBZUEYsIEdhcyBkZWwgRXN0YWRvLCBCb2xldGluIEluZm9ybWF0aXZvIGRlIFRlY2hpbnQgeSBzZXJpZXMgcHJvcGlhcyBkZSBJREVFDQoqIE1lbW9yaWEgQW51YWwgeSBiYWxhbmNlcyBjb250YWJsZXMgZGUgWVBGICh2YXJpb3MgYcOxb3MpLiBQcmVjaW8gaW50ZXJvIHByb21lZGlvIHJlc3VsdGFudGUgZGUgbGEgcmVsYWNpw7NuIGVudHJlIHZlbnRhcyB5IGNhbnRpZGFkZXMgcHJvZHVjaWRhcy4NCiogUHJlY2lvcyBhbnVhcmlvLiAqKkZBTFRBIEJVU0NBUioqDQoNCioqKnZlciBkZSBkb25kZSBzYWNhbiBlbCBUQ0MqKioNCioqKmNhbWJpYXIgcHJlY2lvIGRlbCA5MiBwb3IgbWVjb24gZXN0aW1hZG8geSB2YWxvcmVzIHJlc3RhbnRlcyBwb3IgZXN0aW1hZG8gZGUgaWRlZSoqKg0KDQojIyMjICBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIENydWRvDQoNCiogQ3JpdGVyaW8gcGFyYSBwcmVjaW9fY3J1ZG86IA0KICArIDE5NjMgYSAxOTY1OiBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUgYWp1c3RhZG8gY29uIGVsIMOtbmRpY2UgZGVsIHByZWNpbyBkZWwgQW51YXJpbyBkZSBZUEYgDQogICsgMTk4OSBhIDE5OTE6IEFudWFyaW8gZGUgWVBGDQogICsgMTk2NiBhIDE5ODg6IEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRQ0KICArIDE5OTI6IE1FQ09OIGFqdXN0YWRvIGNvbiBsYSB2YXJpYWNpw7NuIGRlbCDDjW5kaWNlIGRlIHByZWNpb3MgaW50ZXJub3MgYWwgcG9yIG1heW9yIChJUElNKQ0KICArIDE5OTMgZW4gYWRlbGFudGU6IE1FQ09OIA0KIA0KICANCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojTWVtb3JpYXMgZGUgWVBGDQp2dGFzX3ByZWNpb19tZW1vX3lwZl9jcnVkbyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lbW9yaWEgWVBGL3Z0YXNfdmFsb3JfY2FudGlkYWRfcHJlY2lvX2NydWRvLnhsc3giKSAlPiUgDQogIHJlbmFtZShjYW50X3ZlbmRpZGFkID0gIm0zIiwgdmFsb3JfdmVuZGlkbyA9ICJ2YWxvciIsIHByZWNpb19hID0gIiQvbTMiLCANCiAgICAgICAgIHRjY19kaWMgPSAiQ290aXogZGljIFUkUyIsIHByZWNpb191c2QgPSAiVSRTIChhIGRpY2llbWJyZSBkZSBjYWRhIGHDsW8pIikgJT4lIA0KICBtdXRhdGUodW5pZGFkX2NhbnQgPSAibTMiLA0KICAgICAgICAgcHJlY2lvX21pX3Blc29zX3lwZl9jcnVkbyA9IHZhbG9yX3ZlbmRpZG8vY2FudF92ZW5kaWRhZCwgDQogICAgICAgICBwcmVjaW9fbWlfeXBmX2NydWRvID0gcHJlY2lvX21pX3Blc29zX3lwZl9jcnVkbyAvIHRjY19kaWMpICU+JSANCiAgIyBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdChhbmlvLCB0Y2MpKSAlPiUNCiAgIyBtdXRhdGUocHJlY2lvX21pX3VzZF95cGZfY3J1ZG8gPSBwcmVjaW9fbWlfeXBmX2NydWRvIC8gdGNjKSAlPiUgI3JlY2FsY3VsbyBkZSBwcmVjaW8gY29uIG51ZXZvIFRDDQogIHNlbGVjdChhbmlvLHVuaWRhZF9jYW50LCBtb25lZGEsIHZhbG9yX3ZlbmRpZG8sIGNhbnRfdmVuZGlkYWQsIA0KICAgICAgICAgcHJlY2lvX21pX3Blc29zX3lwZl9jcnVkbyx0Y2NfZGljLCAgcHJlY2lvX21pX3lwZl9jcnVkbykNCg0KIyBCYXNlIE1FQ09ODQpwcmVjaW9fbWlfbWVjb25fY3J1ZG8gPC0gaGlkcm9jYXJidXJvc19iYXNlX21lY29uICU+JSANCiAgZmlsdGVyKGluZGljYWRvciA9PSBsaXN0YV9maWx0cm9bMl0sIA0KICAgICAgICAgYWN0aXZpZGFkX3Byb2R1Y3RvX25vbWJyZSA9PSAiUGV0csOzbGVvIGNydWRvIiwNCiAgICAgICAgIGFsY2FuY2VfdGlwbyA9PSAiUEFJUyIpICU+JQ0KICBtdXRhdGUoYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19taV9tZWNvbl9jcnVkbyA9IG1lYW4odmFsb3IpKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL20zIikNCg0KDQojTUVDT04gLyBDVUVOVEFTIE5BQ0lPTkFMRVMgDQpwcmVjaW9zX21lY29uIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVjb24vYmFzZS1taW5lcmlhLWUtaGlkcm9jYXJidXJvcyBjdWVudGFzIG5hY2lvbmFsZXMueGxzIiwgDQogICAgc2hlZXQgPSAiUHJlY2lvcyIsIHNraXAgPSA3KSAlPiUgDQogIHJlbmFtZShhbmlvID0gIi4uLjEiLA0KICAgICAgICAgbWVzID0gIi4uLjIiLA0KICAgICAgICAgcHJlY2lvX2NvYnJlX2NfbGIgPSAiQ290aXphY2nDs24gQm9sc2EgZGUgTG9uZHJlcyAoTE1FKSIsDQogICAgICAgICBwcmVjaW9fb3JvX3VzZF9venQgPSAgIkNvdGl6YWNpw7NuIEJvbHNhIGRlIE51ZXZhIFlvcmsgKENPTUVYKSIsDQogICAgICAgICBwcmVjaW9fcGxhdGFfdXNkX296dCA9ICJDb3RpemFjacOzbiBMb25kb24gQnVsbGlvbiBNYXJrZXQgQXNzb2NpYXRpb24gKExCTUEpIiwNCiAgICAgICAgIHByZWNpb19jaW5jX2NfbGIgPSAiQ290aXphY2nDs24gTE1FIiwNCiAgICAgICAgIHByZWNpb19oaWVycm9fdXNkX3RuID0gIjY3LDU1JSBCcmFzaWwiLA0KICAgICAgICAgcHJlY2lvX3Bsb21vX3VzZF90biA9ICJMb25kb24gTWV0YWwgRXhjaGFuZ2UiLA0KICAgICAgICAgcHJlY2lvX2dhc19tZV9wZXNvc19NbTMgPSAibWVyY2FkbyBleHRlcm5vLi4uOSIsDQogICAgICAgICBwcmVjaW9fZ2FzX21pX3Blc29zX01tMyA9ICJtZXJjYWRvIGludGVybm8uLi4xMCIsDQogICAgICAgICBwcmVjaW9fY3J1ZG9fbWVfdXNkX20zID0gIm1lcmNhZG8gZXh0ZXJuby4uLjExIiwNCiAgICAgICAgIHByZWNpb19jcnVkb19tZV91c2RfYmJsICA9ICIuLi4xMiIsDQogICAgICAgICBwcmVjaW9fY3J1ZG9fbWlfdXNkX20zID0gIm1lcmNhZG8gaW50ZXJuby4uLjEzIiwNCiAgICAgICAgIHByZWNpb19jcnVkb19taV91c2RfYmJsICA9ICIuLi4xNCIsDQogICAgICAgICBwcm9tZWRpb19icmVudF9kdWJhaV93dGlfdXNkX2JibCA9ICJQcm9tZWRpbyBCcmVudC1EdWJhaS1XVEkiLA0KICAgICAgICAgYnJlbnRfdWtfdXNkX2JibCA9IkJyZW50ICBQdWVydG9zIEdyYW4gQnJldGHDsWEiKSAlPiUgDQogIGZpbHRlcighaXMubmEoYW5pbykpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UocHJlY2lvX2dhc19tZV9wZXNvc19NbTMgPSBtZWFuKHByZWNpb19nYXNfbWVfcGVzb3NfTW0zLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcHJlY2lvX2dhc19taV9wZXNvc19NbTMgPSBtZWFuKCBwcmVjaW9fZ2FzX21pX3Blc29zX01tMywgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIHByZWNpb19jcnVkb19tZV91c2RfYmJsID0gbWVhbiggcHJlY2lvX2NydWRvX21lX3VzZF9iYmwsIG5hLnJtID0gVCksDQogICAgICAgICAgICBwcmVjaW9fY3J1ZG9fbWlfdXNkX2JibCA9IG1lYW4oIHByZWNpb19jcnVkb19taV91c2RfYmJsLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcHJvbWVkaW9fYnJlbnRfZHViYWlfd3RpX3VzZF9iYmwgPSBtZWFuKCBwcm9tZWRpb19icmVudF9kdWJhaV93dGlfdXNkX2JibCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGJyZW50X3VrX3VzZF9iYmwgPSBtZWFuKCBicmVudF91a191c2RfYmJsLCBuYS5ybSA9IFQpKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWwpICU+JSANCiAgbXV0YXRlKCBwcmVjaW9fY3J1ZG9fbWVfcGVzb3NfYmJsID0gIHByZWNpb19jcnVkb19tZV91c2RfYmJsICpUQ0MsDQogICAgICAgICAgcHJlY2lvX2NydWRvX21pX3Blc29zX2JibCA9ICBwcmVjaW9fY3J1ZG9fbWlfdXNkX2JibCAqVENDKQ0KDQoNCiMjIEJhc2UgcmVnYWxpYXMNCnByZWNpb19taV9yZWdhbGlhc19jcnVkbyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3ByZWNpb19tZXJjYWRvX2ludGVybm9fY3J1ZG9fcmVnYWxpYXMuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUNCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIsDQogICAgICAgICBtZXMgPSAiTUVTIiwNCiAgICAgICAgIHRvdGFsX3RpcG9fY3J1ZG8gPSAiVE9UQUwgVElQTyBERSBDUlVETyIpICU+JSANCiAgICBtdXRhdGUodW5pZGFkID0gIlVTRC9tMyIsDQogICAgICAgICBhbmlvID0gbmEubG9jZihhbmlvKSkgJT4lICANCiAgc2VsZWN0KGFuaW8sIG1lcywgdW5pZGFkLCB0b3RhbF90aXBvX2NydWRvLCBldmVyeXRoaW5nKC4pLCAtYyhCUkVOVCwgV1RJKSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9ICJ0aXBvX2NydWRvIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDU6bmNvbCguKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JQ0KICBzdW1tYXJpc2UocHJlY2lvX21pX3JlZ2FsaWFzX2NydWRvID0gbWVhbih0b3RhbF90aXBvX2NydWRvKSwNCiAgICAgICAgICAgIHByZWNpb19wcm9tZWRpb190aXBvX2NydWRvID0gbWVhbih2YWxvcikpICU+JSANCiAgbXV0YXRlKHRpcG9fcHJlY2lvID0gIm1lcmNhZG8gaW50ZXJubyIpDQoNCiMgUmV2aXN0YSBJREVFDQojIHByZWNpb3MgaW50ZXJub3MgdnMgcHJlY2lvIHByb21lZGlvIGludGVybm8gZGUgZWV1dSB2cyBwcmVjaW8gYXJhYmFpIHNhdWRpdGEuIGN1YWRybyAzLjEuMy4xIHAuMTcwDQpwcmVjaW9fbWlfdnNfaW50ZXJuYWNpb25hbF9pZGVlX2NydWRvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gNCkNCg0KDQojbWVyZ2UNCnByZWNpb19taV9jcnVkbyA8LSBwcmVjaW9fbWlfcmVnYWxpYXNfY3J1ZG8gJT4lICANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX21pX3JlZ2FsaWFzX2NydWRvKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fbWlfbWVjb25fY3J1ZG8gKSAlPiUgDQogIGZ1bGxfam9pbih2dGFzX3ByZWNpb19tZW1vX3lwZl9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgIHByZWNpb19taV95cGZfY3J1ZG8gKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX3ZzX2ludGVybmFjaW9uYWxfaWRlZV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fbWlfaWRlZV9jcnVkbyA9IHByZWNpb19jcnVkb19uZXVxdWluYV90Y19vZmljaWFsICkpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvbTMiKSAlPiUgDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19taV9yZWdhbGlhc19jcnVkbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICJwcmVjaW9fbWlfbWVjb25fY3J1ZG8iLCAicHJlY2lvX21pX3lwZl9jcnVkbyIsICJwcmVjaW9fbWlfaWRlZV9jcnVkbyIpLCANCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zYmJsX3ApICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX21pX21lY29uX2Njbm5fY3J1ZG8gPSBwcmVjaW9fY3J1ZG9fbWlfdXNkX2JibCApKSAlPiUgDQogIGxlZnRfam9pbihpcGltX2Jhc2U5NCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBpcGltX25pdmVsX2dyYWxfOTQpLCBieSA9ICJhbmlvIikgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSBwcmVjaW9fbWlfcmVnYWxpYXNfY3J1ZG8sDQogICAgICAgICBtZWNvbiA9IHByZWNpb19taV9tZWNvbl9jcnVkbywNCiAgICAgICAgIHlwZiA9IHByZWNpb19taV95cGZfY3J1ZG8sDQogICAgICAgICBpZGVlID0gcHJlY2lvX21pX2lkZWVfY3J1ZG8sDQogICAgICAgICBtZWNvbl9jY25uID0gcHJlY2lvX21pX21lY29uX2Njbm5fY3J1ZG8pICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIHVuZ3JvdXAoKQ0KcHJlY2lvX21pX2NydWRvIDwtICBwcmVjaW9fbWlfY3J1ZG8gJT4lIA0KICBtdXRhdGUoIHVuaWRhZCA9ICJVU0QvYmFycmlsZXMiLA0KICAgICAgICAgICB2YXJpYWJsZSA9ICAiUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIHBldHLDs2xlbyBjcnVkbyBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMiLA0KICAgICAgICAgIG1lY29uX2VzdGltYWRvID0gcHJlY2lvX21pX2NydWRvJG1lY29uW3ByZWNpb19taV9jcnVkbyRhbmlvPT0xOTk0XSppcGltX25pdmVsX2dyYWxfOTQsDQogICAgICAgICAgaW5kaWNlX3lwZl83MiA9IGdlbmVyYXJfaW5kaWNlKHNlcmllID0geXBmLCBmZWNoYSA9IGFuaW8sIGZlY2hhX2Jhc2UgPSAxOTcyKSwNCiAgICAgICAgIGlkZWVfZXN0aW1hZG8gPSBwcmVjaW9fbWlfY3J1ZG8kaWRlZVtwcmVjaW9fbWlfY3J1ZG8kYW5pbz09MTk3Ml0gKiBpbmRpY2VfeXBmXzcyLA0KICAgICAgICAgcHJlY2lvX2NydWRvX21kb2ludCA9ICAgY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTYzOjE5NjUgfiBpZGVlX2VzdGltYWRvLA0KICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTY2OjE5ODggfiBpZGVlLA0KICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTg5OjE5OTEgfiB5cGYsDQogICAgICAgICAgICAgICAgYW5pbyA9PSAxOTkyIH4gbWVjb25fZXN0aW1hZG8sDQogICAgICAgICAgICAgICAgYW5pbyA+MTk5MiB+IG1lY29uKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCB2YXJpYWJsZSwgcHJlY2lvX2NydWRvX21kb2ludCAsIGV2ZXJ5dGhpbmcoLiksIA0KICAgICAgICAgLWMoaXBpbV9uaXZlbF9ncmFsXzk0LCBpZGVlX2VzdGltYWRvLG1lY29uX2VzdGltYWRvLGluZGljZV95cGZfNzIsaWRlZV9lc3RpbWFkbyApKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KICANCiAgDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX21pX2NydWRvLCBwYXRoID0gInJlc3VsdGFkb3MvcHJlY2lvX21pX2NydWRvLnhsc3giKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX21pX3ZzX2ludGVybmFjaW9uYWxfaWRlZV9jcnVkbyAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHByZWNpb19jcnVkb19uZXVxdWluYV90Y19vZmljaWFsICkgJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgICAgc3ByZWFkKC4sDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gYW5pbywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHByZWNpb19jcnVkb19uZXVxdWluYV90Y19vZmljaWFsKSAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUodmFyaWFibGUgPSAicHJlY2lvX2NydWRvX25ldXF1aW5hX3RjX29maWNpYWwgZW4gVVNEL20zIikgJT4lDQojICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QodmFyaWFibGUsIGV2ZXJ5dGhpbmcoLikpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicHJlY2lvX21pX3ZzX2ludGVybmFjaW9uYWxfaWRlZV9jcnVkby54bHN4IikNCmBgYA0KDQo8YnI+DQoqKlRhYmxhIDMuIFByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBwZXRyw7NsZW8gY3J1ZG8gZW4gQXJnZW50aW5hIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyAoYmFycmlsZXMpKioNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcmVjaW9fbWlfY3J1ZG8gJT4lIA0KICBzZWxlY3QoLXByZWNpb19jcnVkb19tZG9pbnQpDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3RseShwcmVjaW9fbWlfY3J1ZG8gJT4lIA0KICAgICAgc2VsZWN0KC1wcmVjaW9fY3J1ZG9fbWRvaW50KSAlPiUgDQogICAgICBtdXRhdGUocmVnYWxpYXMgPSANCiAgICAgICAgICAgICAgIGNhc2Vfd2hlbihyZWdhbGlhcyA9PSAwIH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiByZWdhbGlhcykpICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9IHZhbG9yLCA0Om5jb2woLikpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB2YXJpYWJsZSwgc2hhcGUgPSB2YXJpYWJsZSkpKw0KICBnZW9tX2xpbmUoYWxwaGEgPSAwLjgpKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIDMuIFByZWNpb3MgZGVsIG1lcmNhZG8gaW50ZXJubyBkZWwgcGV0csOzbGVvIGNydWRvLg0KICAgICAgIEFyZ2VudGluYSAoMTk2MyAtIDIwMjApIiwNCiAgICAgICB5ID0gIlVTRC9iYXJyaWwiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KICAgICAgICAgICAgICAgICAgICAgDQpgYGANCg0KDQojIyMjIFByZWNpbyBNZXJjYWRvIEludGVybm8gZGUgR2FzIE5hdHVyYWwNCiogUHJlY2lvIE1lcmNhZG8gSW50ZXJubyBkZSBnYXM6DQogICsgMTk2MyAtIDE5NjkgJiAxOTg5IC0gMTk5MjogQW51YXJpbyBkZSBZUEYNCiAgKyAxOTcwIC0gMTk4ODogIEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRQ0KICArIDE5OTMgZW4gYWRlbGFudGU6IFNlY3JldGFyw61hIGRlIEVuZXJnw61hIC0gQmFzZSBSZWdhbMOtYXMNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0FudWFyaW8gWVBGDQp2dGFzX3ByZWNpb19tZW1vX3lwZl9nYXMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZW1vcmlhIFlQRi92dGFzX3ZhbG9yX2NhbnRpZGFkX3ByZWNpb19nYXMueGxzeCIpICU+JSANCiAgICByZW5hbWUoY2FudF92ZW5kaWRhZCA9ICJtMyIsIHZhbG9yX3ZlbmRpZG8gPSAiJCIsIG1vbmVkYSA9ICJNb25lZGEiKSAlPiUgDQogIGxlZnRfam9pbih2dGFzX3ByZWNpb19tZW1vX3lwZl9jcnVkbyAlPiUgc2VsZWN0KGFuaW8sIG1vbmVkYSwgdGNjX2RpYyApKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwgPSAodmFsb3JfdmVuZGlkby9jYW50X3ZlbmRpZGFkKSAvIDEwMDAsDQogICAgICAgICBwcmVjaW9fbWlfdXNkX3lwZl9nYXMgPSBwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwgLyB0Y2NfZGljLA0KICAgICAgICAgcHJlY2lvX21pX3lwZl9nYXMgPSBjYXNlX3doZW4oICNob21vZ2VuaXphbW9zIGxvcyBjYW1iaW9zIGRlIG1vbmVkYQ0KICAgICAgICAgICBtb25lZGEgPT0gIm0kbiIgfiBwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwvY29udmVyc29yX3Blc29zJGBtJG5gICwNCiAgICAgICAgICAgbW9uZWRhID09ICIkbGV5IiB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbC9jb252ZXJzb3JfcGVzb3MkYCRMZXlgLCANCiAgICAgICAgICAgbW9uZWRhID09ICIkYXJnIiB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbC9jb252ZXJzb3JfcGVzb3MkYCRhYCwgDQogICAgICAgICAgIG1vbmVkYSA9PSAiQSIgfiBwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwvY29udmVyc29yX3Blc29zJEEsDQogICAgICAgICAgIFQgfiBwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwpLA0KICAgICAgICAgbW9uZWRhID0gImFycyIsDQogICAgICAgICB1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikgJT4lICNhY2xhcmFtb3MgbGEgdW5pZGFkIG1vbmV0YXJpYSB5YSB0cmFuc2Zvcm1hZGENCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgbW9uZWRhLCB2YWxvcl92ZW5kaWRvLCBjYW50X3ZlbmRpZGFkLCANCiAgICAgICAgIHByZWNpb19taV95cGZfZ2FzLHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbCwgdGNjX2RpYywgcHJlY2lvX21pX3VzZF95cGZfZ2FzKQ0KDQojQW51YXJpbyBDb21idXN0aWJsZQ0KYW51YXJpb19kZV9jb21idXN0aWJsZSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0FudWFyaW8gQ29tYnVzdGlibGVzL2FudWFyaW8gZGUgY29tYnVzdGlibGUueGxzeCIpICU+JSANCiAgZmlsdGVyKG1lcmNhbmNpYSA9PSAiZ2FzX25hdHVyYWwiKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8gLCAgICAgbWVzLCAgICAgIHVuaWRhZCApICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19taV9hbnVhcmlvX2dhcyA9IG1lYW4odmFsb3IpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8gLCAgICAgICB1bmlkYWQgKSAlPiUgDQogIHN1bW1hcmlzZShwcmVjaW9fbWlfYW51YXJpb19nYXMgPSBtZWFuKHByZWNpb19taV9hbnVhcmlvX2dhcykpICU+JSANCiAgbXV0YXRlKHByZWNpb19taV9hbnVhcmlvX2dhcyA9IChwcmVjaW9fbWlfYW51YXJpb19nYXMvY29udmVyc29yX3Blc29zJEEpLzEwMDAsDQogICAgICAgICB1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikNCg0KIyBCYXNlIE1FQ09ODQpwcmVjaW9zX2ludGVybm9zX21lY29uX2dhcyA8LSBoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gJT4lIA0KICBmaWx0ZXIoaW5kaWNhZG9yID09IGxpc3RhX2ZpbHRyb1syXSwgDQogICAgICAgICBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlID09ICJHYXMgbmF0dXJhbCIsDQogICAgICAgICBhbGNhbmNlX3RpcG8gPT0gIlBBSVMiKSAlPiUNCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKGZlY2hhKSkgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShwcmVjaW9fbWlfbWVjb25fZ2FzID0gbWVhbih2YWxvcikpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KDQoNCiMjIEJhc2UgcmVnYWxpYXMNCiN2YWxvcmVzIDkzIC0gOTgNCnByZWNpb19yZWdhbGlhc190b3RhbF9nYXMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9QcmVjaW9zL3ByZWNpb19taV9nYXMueGxzeCIsDQogICAgc2hlZXQgPSAiamsiKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMTk5OSkgJT4lIA0KICBtdXRhdGUocHJlY2lvX3RvdGFsX2dhcyA9IHByZWNpb19taV9nYXMgKiAxMDAwLA0KICAgICAgICAgdW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIpICU+JSANCiAgc2VsZWN0KC1wcmVjaW9fbWlfZ2FzKQ0KDQojdmFsb3JlcyBwb3N0IDk5DQpwcmVjaW9fcmVnYWxpYXNfbWlfZ2FzIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmVnYWxpYXMvcHJlY2lvX21lcmNhZG9faW50ZXJub19nYXNfcmVnYWxpYXMuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUNCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIsDQogICAgICAgICBtZXMgPSAiTUVTIiwNCiAgICAgICAgIHRvdGFsX2N1ZW5jYSA9ICJUT1RBTCBDVUVOQ0EiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIiwNCiAgICAgICAgIGFuaW8gPSBuYS5sb2NmKGFuaW8pKSAlPiUgDQogIHNlbGVjdChhbmlvLCBtZXMsIHVuaWRhZCwgIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSAiY3VlbmNhIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSBnc3ViKCIsIiwgIiIsIHZhbG9yKSwNCiAgICAgICAgIHZhbG9yID0gYXMuZG91YmxlKHZhbG9yKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQsIGN1ZW5jYSkgJT4lIA0KICBzdW1tYXJpc2UocHJlY2lvX3Byb21lZGlvX2N1ZW5jYSA9IG1lYW4odmFsb3IpKSU+JSANCiAgbXV0YXRlKHRpcG9fcHJlY2lvID0gIm1lcmNhZG8gaW50ZXJubyIpICU+JSANCiAgZmlsdGVyKGN1ZW5jYSA9PSAidG90YWxfY3VlbmNhIiklPiUgICNxdWl0byBwcmVjaW8gcHJvbWVkaW8gZWxhYm9yYWRvIHBxIG5vIHNlIHVzYXLDoQ0KICBsZWZ0X2pvaW4ocHJlY2lvX3JlZ2FsaWFzX3RvdGFsX2dhcykgJT4lIA0KICBtdXRhdGUocHJlY2lvX21pX3JlZ2FsaWFzX2dhcyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5OSB+IHByZWNpb190b3RhbF9nYXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBwcmVjaW9fcHJvbWVkaW9fY3VlbmNhKSkgJT4lIA0KICBzZWxlY3QoLWMocHJlY2lvX3RvdGFsX2dhcywgcHJlY2lvX3Byb21lZGlvX2N1ZW5jYSkpDQoNCiNSZXZpc3RhIElERUUNCiNwcmVjaW8gdHJhbnNmZXJlbmNpYSwgcmVnYWxpYXMsIGNvbXBlbnNhY2lvbmVzLCBldGMgcHJvbWVkaW8gYW51YWwNCnByZWNpb19taV9pZGVlX2dhcyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgZ2FzIG5hdHVyYWwgeSBkZXJpdmFkb3MgMTk3MCAtIDE5ODgueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX3RyYW5zZmVyZW5jaWEpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY183MCkpICU+JQ0KICBtdXRhdGUocHJlY2lvX21pX2luZGV4YWRvX3Blc29zID0gcHJlY2lvX3RyYW5zZmVyZW5jaWEgKiBpcGNfNzAgLyBjb252ZXJzb3JfcGVzb3MkYCRMZXlgKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYykgKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fbWlfaW5kZXhhZG9fdXNkID0gcHJlY2lvX21pX2luZGV4YWRvX3Blc29zL3RjYyApICANCiAgIyBzZWxlY3QoLWModW5pZGFkLCBwcmVjaW9fdHJhbnNmZXJlbmNpYSkpDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fbWlfaWRlZV9nYXMsIHBhdGggPSAicHJlY2lvX21pX2lkZWVfZ2FzLnhsc3giKQ0KDQojY29udmVyc29yIGRlIG1vbmVkYSANCiMgJT4lIA0KIyAgIG11dGF0ZShwcmVjaW9fdHJhbnNmZXJlbmNpYSA9IGNhc2Vfd2hlbigNCiMgICAgIGFuaW8gPCAxOTgzIH4gcHJlY2lvX3RyYW5zZmVyZW5jaWEvY29udmVyc29yX3Blc29zJGAkTGV5YCwNCiMgICAgIGFuaW8gPT0gMTk4MyB+IHByZWNpb190cmFuc2ZlcmVuY2lhIC8gY29udmVyc29yX3Blc29zJGAkYWAsDQojICAgICBhbmlvICVpbiUgMTk4MzoxOTkxIH4gcHJlY2lvX3RyYW5zZmVyZW5jaWEvY29udmVyc29yX3Blc29zJEEpKQ0KDQojTWVyZ2UNCnByZWNpb19taV9nYXMgPC0gcHJlY2lvX3JlZ2FsaWFzX21pX2dhcyAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19taV9yZWdhbGlhc19nYXMpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfaW50ZXJub3NfbWVjb25fZ2FzKSAlPiUgDQogIGZ1bGxfam9pbih2dGFzX3ByZWNpb19tZW1vX3lwZl9nYXMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCAgcHJlY2lvX21pX3lwZl9nYXMgKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX2lkZWVfZ2FzICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHByZWNpb19taV9pZGVlX2luZGV4YWRvID0gcHJlY2lvX21pX2luZGV4YWRvX3Blc29zKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJlY2lvX21pX2lkZWVfY3Rlc19wZXNvcyA9IHByZWNpb190cmFuc2ZlcmVuY2lhKSkgJT4lIA0KICBsZWZ0X2pvaW4oYW51YXJpb19kZV9jb21idXN0aWJsZSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvICwgcHJlY2lvX21pX21lY29uX2Njbm5fZ2FzID0gcHJlY2lvX2dhc19taV9wZXNvc19NbTMpKSAlPiUgDQogICMgbXV0YXRlKHByZWNpb19nYXNfbWRvaW50ID0gY2FzZV93aGVuKGFuaW8gPCAxOTg4IH4gcHJlY2lvX21pX3lwZl9nYXMsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTg4IH4gIHByZWNpb19taV9pZGVlX2luZGV4YWRvLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTg5OjE5OTEgIH4gcHJlY2lvX21pX3lwZl9nYXMsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTkyICB+IHByZWNpb19taV95cGZfZ2FzLzEwLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAxOTkyIH4gcHJlY2lvX21pX3JlZ2FsaWFzX2dhcyksDQogICMgICAgICAgIGRpZl95cGZfaWRlZSA9IHByZWNpb19taV95cGZfZ2FzL3ByZWNpb19taV9pZGVlX2luZGV4YWRvLTEgKSAlPiUNCiAgbXV0YXRlKHZhcmlhYmxlID0gIlByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBnYXMgbmF0dXJhbCBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMiLA0KICAgICAgICAgcHJlY2lvX2dhc19tZG9pbnQgPSBjYXNlX3doZW4oYW5pbyAlaW4lIDE5NjM6MTk2OXxhbmlvICVpbiUgMTk4OToxOTkxIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9fbWlfeXBmX2dhcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTcwOjE5ODggfiBwcmVjaW9fbWlfaWRlZV9pbmRleGFkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTkyICB+IHByZWNpb19taV95cGZfZ2FzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID4gMTk5MiB+IHByZWNpb19taV9yZWdhbGlhc19nYXMpICkgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLHZhcmlhYmxlLCBwcmVjaW9fZ2FzX21kb2ludCwgZXZlcnl0aGluZyguKSApICU+JSANCiAgcmVuYW1lKHJlZ2FsaWFzID0gcHJlY2lvX21pX3JlZ2FsaWFzX2dhcywNCiAgICAgICAgIG1lY29uID0gcHJlY2lvX21pX21lY29uX2dhcywNCiAgICAgICAgIHlwZiA9IHByZWNpb19taV95cGZfZ2FzLA0KICAgICAgICAgaWRlZSA9IHByZWNpb19taV9pZGVlX2luZGV4YWRvLA0KICAgICAgICAgbWVjb25fY2NubiA9IHByZWNpb19taV9tZWNvbl9jY25uX2dhcywNCiAgICAgICAgIGFudWFyaW8gPSBwcmVjaW9fbWlfYW51YXJpb19nYXMpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAyMDIxKQ0KDQojcHJlY2lvIGludGVybm8gZW4gTU1CVFUgcGVzb3MNCnByZWNpb19taV9nYXNfTU1CVFUgPC0gIHByZWNpb19taV9nYXMgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHNlbGVjdCgtYyh1bmlkYWQsIHZhcmlhYmxlKSkgJT4lIA0KICBtdXRhdGVfYWxsKCBmdW5jdGlvbih4KSB7Y29udmVyc29yX20zTU1CVFVfcCh4LzEwMDApfSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gImFycy9NTUJUVSIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCg0KI3ByZWNpbyBpbnRlcm5vIGVuIE1NQlRVIHVzZA0KcHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZCA8LSBwcmVjaW9fbWlfZ2FzX01NQlRVICU+JQ0KICAjIHNlbGVjdCgtZGlmX3lwZl9pZGVlKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOm5jb2woLikpICU+JQ0KIGxlZnRfam9pbih0Y3BfYW51YWxfYiwgYnkgPSAiYW5pbyIpICU+JQ0KICBtdXRhdGUodmFsb3IgPSB2YWxvci8gdGNjLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9NTUJUVSIpICU+JSANCiAgc2VsZWN0KC1jKHRjYyx0Y3AsIHNvYnJldmFsdWFjaW9uKSkgJT4lIA0KICBzcHJlYWQoa2V5ID0gdGlwb19wcmVjaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKQ0KDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fbWlfZ2FzLCBwYXRoID0gInJlc3VsdGFkb3MvcHJlY2lvX21pX2dhcy54bHN4IikNCg0KI3ByZWNpbyByZXZpc3RhIHRyYW5zcHVlc3RvDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX21pX2lkZWVfZ2FzICU+JSANCiMgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHJlY2lvX3RyYW5zZmVyZW5jaWFfeXBmX2FfR0UgPXByZWNpb190cmFuc2ZlcmVuY2lhICkgJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgICAgc3ByZWFkKC4sDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gYW5pbywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHByZWNpb190cmFuc2ZlcmVuY2lhX3lwZl9hX0dFKSAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUodmFyaWFibGUgPSAicHJlY2lvX3RyYW5zZmVyZW5jaWFfeXBmX2FfR0UgZW4gcGVzb3MgZGUgMTk3MC8xMDAwIG0zIikgJT4lDQojICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QodmFyaWFibGUsIGV2ZXJ5dGhpbmcoLikpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicHJlY2lvX21pX2lkZWVfZ2FzLnhsc3giKQ0KDQojIGdyYWZfbWlfZ2FzIDwtIHByZWNpb19taV9pZGVlX2dhcyAlPiUgDQojICAgc2VsZWN0KGFuaW8sIHByZWNpb19taV9pbmRleGFkb19wZXNvcywgcHJlY2lvX21pX2luZGV4YWRvX3VzZCkgJT4lIA0KIyAgIGdhdGhlciguLA0KIyAgICAgICAgICBrZXkgPSB2YXJpYWJsZSAsDQojICAgICAgICAgIHZhbHVlID0gdmFsb3IsDQojICAgICAgICAgIDI6MykgJT4lDQojICAgZmlsdGVyKHZhcmlhYmxlID09InByZWNpb19taV9pbmRleGFkb191c2QiICkgJT4lIA0KIyAgIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdmFyaWFibGUpKSsNCiMgICBnZW9tX2xpbmUoKQ0KIyBncmFmX21pX2dhcw0KDQojIHByZWNpb19taV9nYXMgJT4lIA0KIyAgIGZpbHRlcihhbmlvID4gMjAwMCkgJT4lIA0KIyAgIHNlbGVjdChhbmlvLCBwcmVjaW9fZ2FzX21kb2ludCwgcHJlY2lvX21pX21lY29uX2Njbm5fZ2FzKQ0KYGBgDQoNCjxicj4NCioqVGFibGEgNC4gUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsIGVuIEFyZ2VudGluYSBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMgKGJhcnJpbGVzKSoqDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcHJlY2lvX21pX2dhcyAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX2dhc19tZG9pbnQpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl9wcmVjaW9faW50ZXJub19nYXNfbW1idHUgPC0gcHJlY2lvX21pX2dhc19NTUJUVSAlPiUNCiAgIyBzZWxlY3QoLWMoZGlmX3lwZl9pZGVlLCBwcmVjaW9fZ2FzX21kb2ludCkpICU+JSANCiAgc2VsZWN0KC1jKCBwcmVjaW9fZ2FzX21kb2ludCkpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6bmNvbCguKSkgJT4lDQogbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yLyB0Y2MpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBhbmlvLCB5ID0gdmFsb3IsIGNvbG9yID0gdGlwb19wcmVjaW8pKSsNCiAgZ2VvbV9saW5lKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogICMgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyBOwrA0LiBQcmVjaW8gZGVsIG1lcmNhZG8gaW50ZXJubyBkZWwgZ2FzIG5hdHVyYWwuDQogICAgICAgQXJnZW50aW5hICgxOTYzIC0gMjAxOCkiLCANCiAgICAgICB5ID0gIlVTRC9NTUJUVSIpDQpnZ3Bsb3RseShncmFmX3ByZWNpb19pbnRlcm5vX2dhc19tbWJ0dSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCmBgYA0KDQoNCiMjIFByZWNpb3MgZGUgUmVmZXJlbmNpYSBkZWwgTWVyY2FkbyBNdW5kaWFsDQpQcmVjaW9zIGRlIGV4cG9ydGFjacOzbiBkZXNkZSBBcmdlbnRpbmEsIGJlbmNobWFya3MgeSBQcmVjaW9zIGRlbCBtZXJjYWRvIGRlIEVFVVUgKHNvbG8gZ2FzLCBpbnRlcm5vcyB5IGRlIGV4cG8vaW1wbykNCg0KKiBbU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEtUmVnYWxpYXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9yZWdhbGlhcy1kZS1wZXRyb2xlby1jcnVkby1nYXMtbmF0dXJhbC1nbHAtZ2Fzb2xpbmEteS1jb25kZW5zYWRvKSkgKDIwMDYtaG95KQ0KKiBbTUVDT05dKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9wcmVjaW8tZGUtZXhwb3J0YWNpb24tZGUtcGV0cm9sZW8tY3J1ZG8pLiBTZXJpZSBjb3J0YSB5IHNpbiB0cmFuc2Zvcm1hY2lvbmVzDQoqIEVJQQ0KICArIFtCcmVudF0oaHR0cHM6Ly93d3cuZWlhLmdvdi9kbmF2L3BldC9oaXN0L1JCUlRFRC5odG0pICgxOTg3LWhveSkNCiAgKyBbV1RJXShodHRwczovL3d3dy5laWEuZ292L2RuYXYvcGV0L2hpc3Qvcnd0Y0QuaHRtKSAoMTk4Ni1ob3kpDQogICsgW0hlbnJ5IEh1Yl0oaHR0cHM6Ly93d3cuZWlhLmdvdi9kbmF2L25nL2hpc3Qvcm5nd2hoZGQuaHRtKSAoMTk5Ny1ob3kpDQogICsgW1ByZWNpbyBHYXMgZGUgQm9jYSBkZSBQb3pvIGVuIEVFVVVdKGh0dHBzOi8vd3d3LmVpYS5nb3YvZG5hdi9uZy9oaXN0L245MTkwdXMzQS5odG0pDQoqIFtJbmZsYXRpb24gRGF0YV0oaHR0cHM6Ly9pbmZsYXRpb25kYXRhLmNvbS9hcnRpY2xlcy9pbmZsYXRpb24tYWRqdXN0ZWQtcHJpY2VzL2hpc3RvcmljYWwtY3J1ZGUtb2lsLXByaWNlcy10YWJsZS8pICgxOTQ2LWhveSkNCiogW0V1cm9zdGF0XShodHRwczovL2VjLmV1cm9wYS5ldS9ldXJvc3RhdC93ZWIvZW5lcmd5L2RhdGEvZGF0YWJhc2UpDQoqIFJldmlzdGEgSURFRSAgIA0KICArIFByZWNpbyBkZSBJbXBvcnRhY2nDs24gZGUgZ2FzIG5hdHVyYWwgZGVzZGUgQm9saXZpYSAoMTk3MC0xOTg4KQ0KKiBbVU4gQ29tdHJhZGVdKGh0dHBzOi8vY29tdHJhZGUudW4ub3JnL2RhdGEvKQ0KICArIFByZWNpbyBkZSBFeHBvcnRhY2nDs24gZSBJbXBvcnRhY2nDs24gZGUgZ2FzIHkgY3J1ZG8gKGEgQm9saXZpYSB5IHByb21lZGlvIG11bmRpYWwpDQogICsgRWwgcHJlY2lvIGltcG8gYm9saXZpYSBkZSAgVU4gQ29tdHJhZGUgY2llcnJhLCBkYSB2YWxvcmVzIGNvaGVyZW50ZXMgcGVybyBubyBkZWJlcmlhLCBkYWRvIHF1ZSBsYSBjb252ZXJzacOzbiBkZWJlcmlhIHJlYWxpemFyc2UgbXVsdGlwbGljYW5kbyBlbCBwcmVjaW8gZW4gTW0zIHBvciAxMDAwIHkgYWjDrSByZWNpw6luIHJlYWxpemFyIGxhIGNvbnZlcnNpw7NuDQogIA0KDQojIyMjIFByZWNpb3MgZGUgUmVmZXJlbmNpYSBkZWwgQ3J1ZG8NCiogRnVlbnRlcyBzZWxlY2Npb25hZGFzIHBhcmEgcHJlY2lvX21lX2NydWRvOiANCiAgKyBlbnRyZSAxOTYyIHkgMTk5MjogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUgKGNsYXNpZmljYWNpw7NuIFNJVEMgYXMgcmVwb3J0ZWQpDQogICsgZW50cmUgMTk5My0yMDAxIHkgMjAwNC0yMDE0OiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBNZWNvbg0KICArIGVudHJlIDIwMDIgeSAyMDAzOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGRlIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZSAoQ2xhc2lmaWNhY2nDs24gSFMgYXMgcmVwb3J0ZWQpDQogICsgMjAxNCBlbiBhZGVsYW50ZTogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgKFJlZ2Fsw61hcykNCiAgKyBWYWxvcmVzIGZhbHRhbnRlcyBwcmV2aW9zIGEgMTk5MiAoMTk3MCAtIDE5ODUpOiBCcmVudCAoRnVlbnRlOiBJbmZsYXRpb24gRGF0YSkNCg0KDQoqKkZhbHRhIGNvbnN0cnVpciB1bmEgcGFyaWRhZCBkZSBleHBvL2ltcG8gY29uIGVsIGZsZXRlKioNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNCYXNlIHJlZ2FsaWFzDQpwcmVjaW9fbWVfcmVnYWxpYXNfY3J1ZG8gPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZWdhbGlhcy9wcmVjaW9fbWVyY2Fkb19leHRlcm5vX2NydWRvX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lDQogIHJlbmFtZShhbmlvID0gIkHDkU8iLA0KICAgICAgICAgbWVzID0gIk1FUyIsDQogICAgICAgICB0b3RhbF90aXBvX2NydWRvID0gIlRPVEFMIFRJUE8gREUgQ1JVRE8iKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL20zIiwNCiAgICAgICAgIGFuaW8gPSBuYS5sb2NmKGFuaW8pKSAlPiUNCiAgc2VsZWN0KGFuaW8sIG1lcywgdW5pZGFkLCB0b3RhbF90aXBvX2NydWRvLCBldmVyeXRoaW5nKC4pLCAtYyhCUkVOVCwgV1RJKSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9ICJ0aXBvX2NydWRvIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDU6bmNvbCguKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JQ0KICBzdW1tYXJpc2UocHJlY2lvX3RvdGFsX3RpcG9fY3J1ZG8gPSBtZWFuKHRvdGFsX3RpcG9fY3J1ZG8pKSAlPiUgDQogICAgICAgICAgICAjIHByZWNpb19wcm9tZWRpb190aXBvX2NydWRvID0gbWVhbih2YWxvcikpJT4lIA0KICBtdXRhdGUodGlwb19wcmVjaW8gPSAibWVyY2FkbyBleHRlcm5vIiwNCiAgICAgICAgIHByZWNpb190b3RhbF90aXBvX2NydWRvID0gY29udmVyc29yX20zYmJsX3AocHJlY2lvX3RvdGFsX3RpcG9fY3J1ZG8pLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9iYXJyaWxlcyIpDQoNCiMgTWVjb24gTU9ESUZJQ0FSIA0KcHJlY2lvX2V4cG9ydGFjaW9uX2NydWRvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvcHJlY2lvLWV4cG9ydGFjaW9uLWNydWRvLnhsc3giLCANCiAgICBza2lwID0gMikNCg0KI0lOREVDIENvbUV4DQpwcmVjaW9fZXhwb19pbmRlYyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSU5ERUMvQ29tRXgvcHJlY2lvX2FudWFsX3Byb21lZGlvX2V4cG9faGlkcm9faW5kZWMuY3N2IiwgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsICU+JSBzZWxlY3QoLVRDUCkpICAlPiUgDQogIG11dGF0ZSggcHJlY2lvX2V4cG9fZ2FzX2luZGVjID0gKHByZWNpb19leHBvX2dhc19pbmRlYykgKiBUQ0MsDQogICAgICAgICAgICAgICAgICAgICAgdW5pZGFkX2dhcyA9ICJhcnMvTWlsZXMgZGUgbTMiCSkNCiAgIyBtdXRhdGUocHJlY2lvX2V4cG9fZ2FzX2luZGVjID0gcHJlY2lvX2V4cG9fZ2FzX2luZGVjICogVENDLCANCiAgIyAgICAgICAgdW5pZGFkID0gY2FzZV93aGVuKHVuaWRhZCA9PSAiVVNEL01pbGVzIGRlIG0zIiB+ICJhcnMvTWlsZXMgZGUgbTMiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHVuaWRhZCkpDQoNCiNVTiBDT01UUkFERQ0KZXhwb19jcnVkb191bmNvbXRyYWRlX2hzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9VTiBDb210cmFkZS9leHBvX2NydWRvX3VuY29tdHJhZGVfaHMuY3N2IikgJT4lIA0KICBtdXRhdGUodW5pZGFkX3ByZWNpbyA9ICJVU0QvYmFycmlsZXMiLA0KICAgICAgICAgdW5pZGFkX3ZhbG9yID0gIlVTRCIsDQogICAgICAgICB1bmlkYWRfY2FudGlkYWQgPSAiYmFycmlsZXMiKSAlPiUgDQogIHJlbmFtZShhbmlvID0gUGVyaW9kLA0KICAgICAgICAgcHJlY2lvX2V4cG9fY29tdHJhZGVfaHNfY3J1ZG8gPSBleHBvX3ByZWNpb19iYmwsIA0KICAgICAgICAgZXhwb191c2RfY29tdHJhZGVfY3J1ZG8gPSAiVHJhZGUgVmFsdWUgKFVTJCkiKQ0KDQpleHBvX2NydWRvX3NpdGMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL1VOIENvbXRyYWRlL2V4cG9fY3J1ZG9fc2l0Yy5jc3YiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfcHJlY2lvID0gIlVTRC9iYXJyaWxlcyIsDQogICAgICAgICB1bmlkYWRfdmFsb3IgPSAiVVNEIiwNCiAgICAgICAgIHVuaWRhZF9jYW50aWRhZCA9ICJiYXJyaWxlcyIpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBQZXJpb2QsDQogICAgICAgICBwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvID0gZXhwb19wcmVjaW9fYmJsLCANCiAgICAgICAgIGV4cG9fdXNkX2NvbXRyYWRlX2NydWRvID0gIlRyYWRlIFZhbHVlIChVUyQpIikNCg0KI01lcmdlIGJhc2VzDQpwcmVjaW9fZXhwb19jcnVkbyA8LSBwcmVjaW9fbWVfcmVnYWxpYXNfY3J1ZG8gJT4lIA0KICByZW5hbWUocHJlY2lvX2V4cG9fcmVnYWxpYXNfY3J1ZG8gPSBwcmVjaW9fdG90YWxfdGlwb19jcnVkbykgJT4lIA0KICBzZWxlY3QoLXRpcG9fcHJlY2lvKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19leHBvX21lY29uX2NydWRvID0gcHJlY2lvX2NydWRvX21lX3VzZF9iYmwgKSkgJT4lDQogIGxlZnRfam9pbihwcmVjaW9fZXhwb19pbmRlYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtYyhwcmVjaW9fZXhwb19nYXNfaW5kZWMsIHVuaWRhZF9nYXMpKSkgJT4lDQogIGxlZnRfam9pbihleHBvX2NydWRvX3VuY29tdHJhZGVfaHMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ByZWNpbywgcHJlY2lvX2V4cG9fY29tdHJhZGVfaHNfY3J1ZG8pKSAlPiUgDQogIGZ1bGxfam9pbihleHBvX2NydWRvX3NpdGMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ByZWNpbywgcHJlY2lvX2V4cG9fY29tdHJhZGVfc2l0Y19jcnVkbykpICU+JQ0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgIyBtdXRhdGUocHJlY2lvX2V4cG9fY3J1ZG8gPSBjYXNlX3doZW4oYW5pbyA8IDE5OTMgfiBwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5OTM6MjAxNCB+IHByZWNpb19leHBvX21lY29uX2NydWRvLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDIwMTQgfiBwcmVjaW9fZXhwb19yZWdhbGlhc19jcnVkbykpICU+JSANCiAgIyBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZXhwb19jcnVkbywgZXZlcnl0aGluZyguKSwgLVRDQykNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSwgLVRDQykNCiMgcHJlY2lvX2V4cG9fY3J1ZG8NCg0KYGBgDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIFByZWNpbyBSZWZlcmVuY2lhIE1lcmNhZG8gRXh0ZXJubyBDcnVkbw0KI0JyZW50DQpicmVudF9hIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUHJlY2lvcy9icmVudC54bHN4IiwgDQogICAgc2tpcCA9IDQpJT4lICANCiAgcmVuYW1lKGFuaW8gPSBZZWFyLCBicmVudF9ub21pbmFsID0gYE5vbWluYWwgUHJpY2VgLCBicmVudF9hZGp1c3RlZCA9IGBJbmZsYXRpb24gQWRqdXN0ZWQgUHJpY2VgKSAgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9iYXJyaWxlcyIsDQogICAgICAgICBhbmlvID0gYXMuZG91YmxlKGFuaW8pKSANCg0KDQpicmVudF9kYWlseSAgPC0gIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUHJlY2lvcy9SQlJURWQueGxzIiwgDQogICAgc2hlZXQgPSAiRGF0YSAxIiwgc2tpcCA9IDIpICU+JQ0KICByZW5hbWUoZmVjaGEgPSBEYXRlLCBicmVudF9zcG90ID0gYEV1cm9wZSBCcmVudCBTcG90IFByaWNlIEZPQiAoRG9sbGFycyBwZXIgQmFycmVsKWApICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvYmFycmlsZXMiLA0KICAgICAgICAgZmVjaGEgPSBhcy5EYXRlKGZlY2hhKSwgDQogICAgICAgICBhbmlvID0geWVhcihmZWNoYSkpIA0KDQpicmVudF9JRUEgIDwtICBicmVudF9kYWlseSAlPiUgDQogIGdyb3VwX2J5KHVuaWRhZCwgYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoYnJlbnRfc3BvdCA9IG1lYW4oYnJlbnRfc3BvdCkpDQoNCmJyZW50IDwtIGJyZW50X2EgJT4lDQogIHNlbGVjdCgtYnJlbnRfYWRqdXN0ZWQpICU+JSANCiAgbGVmdF9qb2luKGJyZW50X0lFQSkgJT4lIA0KICAjIG11dGF0ZShkaWYgPSBicmVudF9zcG90L2JyZW50X25vbWluYWwgLSAxKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgcmVuYW1lKGJyZW50X2llYSA9IGJyZW50X3Nwb3QsDQogICAgICAgICBicmVudF9oaXN0b3JpYyA9IGJyZW50X25vbWluYWwpDQoNCiNXVEkgDQp3dGlfRUlBX2RhaWx5IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL1JXVENkLnhscyIsIA0KICAgIHNoZWV0ID0gIkRhdGEgMSIsIHNraXAgPSAyKSAlPiUgDQogIHJlbmFtZSh3dGlfZWlhID0gYEN1c2hpbmcsIE9LIFdUSSBTcG90IFByaWNlIEZPQiAoRG9sbGFycyBwZXIgQmFycmVsKWAgKSAlPiUgDQogIG11dGF0ZShtZXMgPSBtb250aChEYXRlKSwNCiAgICAgICAgIGFuaW8gPSB5ZWFyKERhdGUpLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9iYXJyaWxlcyIpDQoNCnd0aV9FSUEgPC0gd3RpX0VJQV9kYWlseSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2Uod3RpX2VpYSA9IG1lYW4od3RpX2VpYSwgbmEucm0gPSBUKSkNCg0Kd3RpX2ZyZWQgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0ZSRUQvV1RJU1BMQy5jc3YiKSAgJT4lDQogIHJlbmFtZSh3dGlfc3BvdF9wcmljZSA9IFdUSVNQTEMpICU+JSANCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKERBVEUpLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9iYXJyaWxlcyIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZSh3dGlfc3BvdF9wcmljZV9mcmVkID0gbWVhbih3dGlfc3BvdF9wcmljZSkpDQogIA0Kd3RpX3JldGVuY2lvbl8wNCA8LSB3dGlfRUlBX2RhaWx5ICAlPiUgDQogIGZpbHRlcihhbmlvID4gMjAwMyApICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgbWVzKSAlPiUgDQogIHN1bW1hcmlzZSh3dGkgPSBtZWFuKHd0aV9laWEpKSAlPiUgDQogIG11dGF0ZShyZXRlbmNpb24gPSBjYXNlX3doZW4od3RpIDwgMzIgfiAwLjI1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSAzMiAmIHd0aSA8IDM0Ljk5IH4gMC4yOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gMzUgJiB3dGkgPCAzNi45OSB+IDAuMzEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDM3ICYgd3RpIDwgMzguOTkgfiAwLjM0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSAzOSAmIHd0aSA8IDQwLjk5IH4gMC4zNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gNDEgJiB3dGkgPCA0Mi45OSB+IDAuNDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDQzICYgd3RpIDwgNDQuOTkgfiAwLjQzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSA0NSB+IDAuNDUpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHJldGVuY2lvbiA9IG1lYW4ocmV0ZW5jaW9uKSkNCg0KDQp3dGlfcmV0ZW5jaW9uXzA3IDwtIHd0aV9FSUFfZGFpbHkgJT4lIA0KICBmaWx0ZXIoYW5pbyAlaW4lIGMoIDIwMDc6MjAxNCksIERhdGUgPiAiMjAwNy0xMS0wMiIgKSAlPiUgDQogIG11dGF0ZShyZXRlbmNpb24gPSBjYXNlX3doZW4od3RpX2VpYSA+PSA2MC45IH4gKHd0aV9laWEgLSA0MikvNDIgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aV9laWEgPCA2MC45IH4gMC40NSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2Uod3RpX2VpYSA9IG1lYW4od3RpX2VpYSksDQogICAgICAgICAgICByZXRlbmNpb24gPSAgbWVhbihyZXRlbmNpb24pKQ0KDQpicmVudF9yZW50ZW5jaW9uXzE0IDwtICBicmVudF9kYWlseSAlPiUNCiAgIGZpbHRlcihhbmlvICVpbiUgYyggMjAxNDoyMDE1KSwgZmVjaGEgPiAiMjAwNy0xMS0wMiIgKSAlPiUNCiAgbXV0YXRlKHJldGVuY2lvbiA9IGNhc2Vfd2hlbihicmVudF9zcG90ID49IDcxIH4gKGJyZW50X3Nwb3QgLSA3MCkvNzAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlbnRfc3BvdCA8IDcxIH4gMC4wMSkpICU+JSANCiAgIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKGJyZW50X3Nwb3QgPSBtZWFuKGJyZW50X3Nwb3QpLA0KICAgICAgICAgICAgcmV0ZW5jaW9uID0gIG1lYW4ocmV0ZW5jaW9uKSkNCiAgDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1ByZWNpbyBkZSBleHBvcnRhY2lvbiB5IHJlZmVyZW5jaWEuIE1lcmdlIGRlIGJhc2VzDQpwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvIDwtICBwcmVjaW9fZXhwb19jcnVkbyAgJT4lICAgDQogIGZ1bGxfam9pbihicmVudCApJT4lICNzZWxlY3QoLWRpZikpICU+JSANCiAgbGVmdF9qb2luKHd0aV9FSUEgKSAlPiUgDQogIGZ1bGxfam9pbih3dGlfZnJlZCkgJT4lIA0KICBtdXRhdGUocHJlY2lvX2V4cG9fY3J1ZG9faW5kZWMgPSBjYXNlX3doZW4ocHJlY2lvX2V4cG9fY3J1ZG9faW5kZWMgPiAzMDAgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBwcmVjaW9fZXhwb19jcnVkb19pbmRlYyksDQogICAgICAgICBwcmVjaW9fbWVfY3J1ZG8gPSBjYXNlX3doZW4oYW5pbyAlaW4lIDE5OTM6MjAwMSB8IGFuaW8gJWluJSAyMDA0OjIwMTQgfiBwcmVjaW9fZXhwb19tZWNvbl9jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvICVpbiUgMjAwMjoyMDAzIH4gcHJlY2lvX2V4cG9fY29tdHJhZGVfaHNfY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDIwMTQgfiBwcmVjaW9fZXhwb19yZWdhbGlhc19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvKSB+IGJyZW50X2hpc3RvcmljLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPCAxOTkzIH4gcHJlY2lvX2V4cG9fY29tdHJhZGVfc2l0Y19jcnVkbykpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX21lX2NydWRvLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBmaWx0ZXIoYW5pbyA8IDIwMjEpDQoNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8sIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9wcmVjaW9fZXhwb195X21kb19tdW5kaWFsX2NydWRvLnhsc3giKQ0KcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX21lX2NydWRvKQ0KDQoNCmdyYWZfcHJlY2lvX21kb19tdW5kaWFsX2NydWRvIDwtIHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gJT4lIA0KICBzZWxlY3QoLXByZWNpb19tZV9jcnVkbykgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19wcmVjaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMzpuY29sKC4pKSAlPiUNCiAgIyBmaWx0ZXIoISh0aXBvX3ByZWNpbyAlaW4lIGMoInByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZSIsICJwcmVjaW9faW1wb19nYXNfYm9saXZpYV9NTUJUVV9jb210cmFkZSIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUiLCAicHJlY2lvX2V4cG9fZ2FzX2luZGVjIikpKSAlPiUNCiAgIyBmaWx0ZXIoYW5pbyAhPSAyMDAyICYgdGlwb19wcmVjaW8gIT0gInByZWNpb19leHBvX2NydWRvX2luZGVjIikgJT4lDQogIGdncGxvdChhZXMoeCA9IGFuaW8sIHkgPSB2YWxvciwgY29sb3IgPSB0aXBvX3ByZWNpbykpKw0KICBnZW9tX2xpbmUoYWxwaGEgPSAwLjkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlByZWNpb3MgZGUgZXhwb3J0YWNpw7NuIHkgcmVmZXJlbmNpYSBkZWwgbWVyY2FkbyBtdW5kaWFsIGRlbCBjcnVkbyIsIA0KICAgICAgIHkgPSAiVVNEL2JhcnJpbGVzIikNCg0KZ2dwbG90bHkoZ3JhZl9wcmVjaW9fbWRvX211bmRpYWxfY3J1ZG8sIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCmBgYA0KDQojIyMjIFByZWNpb3MgZGUgUmVmZXJlbmNpYSBkZWwgR2FzDQoNCiogQ3JpdGVyaW8gZGUgcHJlY2lvX2V4dGVybm9fZ2FzOg0KICArIEHDsW9zIDE5NjQgeSAxOTY1OiBQcmVjaW8gZGUgaW1wb3J0YWNpw7NuIGRlIGdhcyBwcm92ZW5pZW50ZSBkZSBCb2xpdmlhIGhhY2lhIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZQ0KICArIDE5NjYgZW4gYWRlbGFudGU6IFByZWNpbyBkZSBleHBvcnRhY2lvbiBkZSBnYXMgZGVzZGUgQm9saXZpYSBhIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZQ0KICArIERhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyBwcmV2aW9zIGEgMTk2MyB5IHBlcsOtb2RvIDE5NjgtMTk3MQ0KDQojIyMjIyBFeHBvcnRhY2nDs24gQXJnZW50aW5hDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgUHJlY2lvIGRlIEV4cG9ydGFjacOzbiBkZWwgR2FzIA0KI3JlZ2FsaWFzDQpwcmVjaW9fZXhwb19yZWdhbGlhc19nYXMgPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZWdhbGlhcy9wcmVjaW9fbWVyY2Fkb19leHRlcm5vX2dhc19yZWdhbGlhcy5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JQ0KICAgcmVuYW1lKGFuaW8gPSAiQcORTyIsDQogICAgICAgICBtZXMgPSAiTUVTIiwNCiAgICAgICAgIHRvdGFsX2N1ZW5jYSA9ICJUT1RBTCBDVUVOQ0EiKSAlPiUgDQogICBtdXRhdGUodW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIsDQogICAgICAgICAgYW5pbyA9IG5hLmxvY2YoYW5pbykpICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIGdhdGhlciguLA0KICAgICAgICAga2V5ID0gImN1ZW5jYSIsDQogICAgICAgICB2YWx1ZSA9ICJ2YWxvciIsDQogICAgICAgICA0Om5jb2woLikpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkLCBjdWVuY2EpICU+JQ0KICBtdXRhdGUodmFsb3IgPSBnc3ViKCIsIiwgIiIsIHZhbG9yKSwNCiAgICAgICAgIHZhbG9yID0gYXMuZG91YmxlKHZhbG9yKSkgJT4lICANCiAgc3VtbWFyaXNlKHByZWNpb19leHBvX2dhc19yZWdhbGlhcyA9IG1lYW4odmFsb3IsIG5hLnJtID0gVCkpICU+JSANCiAgbXV0YXRlKHRpcG9fcHJlY2lvID0gIm1lcmNhZG8gZXh0ZXJubyIpICU+JQ0KICBmaWx0ZXIoY3VlbmNhID09ICJ0b3RhbF9jdWVuY2EiKSU+JQ0KICBhcnJhbmdlKGFuaW8pDQoNCiNjb210cmFkZQ0KZXhwb19nYXNfY29tdHJhZGUgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL1VOIENvbXRyYWRlL3Jlc3VsdGFkb3MvZXhwb19nYXNfc2l0Yy5jc3YiKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYykpICU+JSANCiAgbXV0YXRlKGV4cG9fcHJlY2lvX01NQlRVID0gY29udmVyc29yX20zTU1CVFVfcChleHBvX3ByZWNpb19NbTMgKSwNCiAgICAgICAgIGV4cG9fcHJlY2lvX01tM19hcnMgPSBleHBvX3ByZWNpb19NbTMgKiB0Y2MpIA0KDQojbWVyZ2UgZGUgYmFzZXMNCiNwcmVjaW8gZW4gcGVzb3MNCnByZWNpb19leHBvX2dhcyA8LSBleHBvX2dhc19jb210cmFkZSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUgPSBleHBvX3ByZWNpb19NbTNfYXJzKSAlPiUgDQogIGZ1bGxfam9pbihwcmVjaW9fZXhwb19yZWdhbGlhc19nYXMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoLWMoY3VlbmNhLCB0aXBvX3ByZWNpbykpKSAlPiUNCiAgbGVmdF9qb2luKHByZWNpb19leHBvX2luZGVjICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX2dhcywgcHJlY2lvX2V4cG9fZ2FzX2luZGVjKSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcighKGlzLm5hKHByZWNpb19leHBvX2dhc19pbmRlYykpKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fZXhwb19nYXNfbWVjb24gPSBwcmVjaW9fZ2FzX21lX3Blc29zX01tMykpDQoNCg0KI3ByZWNpb3MgZW4gZG9sYXJlcw0KcHJlY2lvX2V4cG9fZ2FzX3VzZCA8LSBleHBvX2dhc19jb210cmFkZSAgJT4lICANCiAgc2VsZWN0KGFuaW8sICBwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUgPSBleHBvX3ByZWNpb19NTUJUVSkgJT4lDQogIGxlZnRfam9pbiggcHJlY2lvX2V4cG9fZ2FzICU+JSBzZWxlY3QoLWMocHJlY2lvX2V4cG9fZ2FzX2NvbXRyYWRlLCB1bmlkYWQpKSwgYnkgPSAiYW5pbyIpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCAlPiUgc2VsZWN0KC1UQ1ApKSAlPiUNCiAgbXV0YXRlKHByZWNpb19leHBvX2dhc19yZWdhbGlhcyA9IChwcmVjaW9fZXhwb19nYXNfcmVnYWxpYXMvMTAwMCkgLyBUQ0MsIA0KICAgICAgICAgcHJlY2lvX2V4cG9fZ2FzX2luZGVjID0gKHByZWNpb19leHBvX2dhc19pbmRlYyApLyBUQ0MsIA0KICAgICAgICAgcHJlY2lvX2V4cG9fZ2FzX21lY29uID0gKHByZWNpb19leHBvX2dhc19tZWNvbi8xMDAwKS8gVENDLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9NTUJUVSIpICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYygicHJlY2lvX2V4cG9fZ2FzX3JlZ2FsaWFzIiwgInByZWNpb19leHBvX2dhc19pbmRlYyIsICJwcmVjaW9fZXhwb19nYXNfbWVjb24iKSwNCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zTU1CVFVfcCkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pLC1UQ0MpDQoNCg0KYGBgDQoNCiMjIyMjIFJlZmVyZW5jaWFzIG11bmRpYWxlcw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIFByZWNpbyBSZWZlcmVuY2lhIE1lcmNhZG8gRXh0ZXJubyBHYXMgDQojIyMjIFByZWNpb3MgTXVuZGlhbGVzDQojaGVucnlfaHViIEVJQQ0KaGVucnlfaHViIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUHJlY2lvcy9STkdXSEhEZC54bHMiLCANCiAgICBzaGVldCA9ICJEYXRhIDEiLCBza2lwID0gMikgJT4lIA0KICByZW5hbWUoIGRhdGUgPSBEYXRlLA0KICAgIGhlbnJ5X2h1Yl9zcG90ID0gYEhlbnJ5IEh1YiBOYXR1cmFsIEdhcyBTcG90IFByaWNlIChEb2xsYXJzIHBlciBNaWxsaW9uIEJ0dSlgKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL01NQlRVIiwNCiAgICAgICAgIGFuaW8gPSB5ZWFyKGRhdGUpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UoZWlhX2hlbnJ5X2h1Yl9zcG90ID0gbWVhbihoZW5yeV9odWJfc3BvdCwgbmEucm0gPSBUKSkgDQoNCmhlbnJ5X2h1Yl9hcnMgPC0gIGhlbnJ5X2h1YiAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWwgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgVENDKSkgJT4lIA0KICBtdXRhdGUoaGVucnlfaHViX3Nwb3QgPSBjb252ZXJzb3JfTU1CVFVtM2dhc19wKGVpYV9oZW5yeV9odWJfc3BvdCAqMTAwMCpUQ0MpLA0KICAgICAgICAgdW5pZGFkPSAiYXJzL01pbGVzIGRlIG0zIikNCg0KIyBQcmVjaW8gVVNBIGJvY2EgZGUgcG96byBFSUEgICAgICAgICAgdW5pZGFkID0gIlVTRC9mdDMiDQp3ZWxsaGVhZF9wcmljZV9lZXV1IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL25hdHVyYWxfZ2FzX3dlbGxoZWFkX3ByaWNlX2VldXUueGxzIiwgDQogICAgc2hlZXQgPSAiRGF0YSAxIiwgc2tpcCA9IDIpICU+JSANCiAgcmVuYW1lKHVzX3dlbGxoZWFkX3ByaWNlX2Z0MyA9ICJVLlMuIE5hdHVyYWwgR2FzIFdlbGxoZWFkIFByaWNlIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KSIpICU+JSAgDQogIG11dGF0ZSggdXNfd2VsbGhlYWRfcHJpY2VfTW0zID0gY29udmVyc29yX2Z0M20zX3AodXNfd2VsbGhlYWRfcHJpY2VfZnQzKjEwMDApLA0KICAgICAgICAgIHVzX3dlbGxoZWFkX3ByaWNlX01NQlRVID0gY29udmVyc29yX2Z0M01NQlRVX3AodXNfd2VsbGhlYWRfcHJpY2VfZnQzLzEwMDApLA0KICAgICAgICAgIGFuaW8gPSB5ZWFyKERhdGUpLA0KICAgICAgICAgdW5pZGFkICA9ICJVU0QiKSANCg0KI290cm9zIHByZWNpb3MgZGUgVVNBIEVJQQ0KcHJpY2VfZWV1dSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9FSUEvZGF0YS9uYXR1cmFsX2dhc19wcmljZXNfdXNhLnhscyIsIA0KICAgIHNoZWV0ID0gIkRhdGEgMSIsIHNraXAgPSAyKSAlPiUgDQogIHJlbmFtZSh1c193ZWxsaGVhZF9nYXNfcHJpY2UgPSBgVS5TLiBOYXR1cmFsIEdhcyBXZWxsaGVhZCBQcmljZSAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfaW1wb3J0X2dhc19wcmljZSA9IGBQcmljZSBvZiBVLlMuIE5hdHVyYWwgR2FzIEltcG9ydHMgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCwNCiAgICAgICAgIHVzX3BpcGVsaW5lX2ltcG9ydF9wcmljZSA9IGBVLlMuIE5hdHVyYWwgR2FzIFBpcGVsaW5lIEltcG9ydHMgUHJpY2UgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCwNCiAgICAgICAgIHVzX2xuZ19pbXBvcnRfcHJpY2UgPSBgUHJpY2Ugb2YgVS5TLiBOYXR1cmFsIEdhcyBMTkcgSW1wb3J0cyAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfZXhwb3J0X2dhc19wcmljZSA9IGBQcmljZSBvZiBVLlMuIE5hdHVyYWwgR2FzIEV4cG9ydHMgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCwNCiAgICAgICAgIHVzX2V4cG9ydF9nYXNfcGlwZWxpbmVfcHJpY2UgPSBgUHJpY2Ugb2YgVS5TLiBOYXR1cmFsIEdhcyBQaXBlbGluZSBFeHBvcnRzIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWAsDQogICAgICAgICB1c19leHBvcnRfbG5nX3ByaWNlID0gYFByaWNlIG9mIExpcXVlZmllZCBVLlMuIE5hdHVyYWwgR2FzIEV4cG9ydHMgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCkgJT4lIA0KICBzZWxlY3QodXNfd2VsbGhlYWRfZ2FzX3ByaWNlLCB1c19pbXBvcnRfZ2FzX3ByaWNlLCB1c19waXBlbGluZV9pbXBvcnRfcHJpY2UsDQogICAgICAgIHVzX2xuZ19pbXBvcnRfcHJpY2UsIHVzX2V4cG9ydF9nYXNfcHJpY2UsDQogICAgICAgIHVzX2V4cG9ydF9nYXNfcGlwZWxpbmVfcHJpY2UsIHVzX2V4cG9ydF9sbmdfcHJpY2UgKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMTkyMjoyMDE5KQ0KICANCg0KcHJpY2VfZWV1dV9NbTMgPC0gIHByaWNlX2VldXUgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpe2NvbnZlcnNvcl9mdDNtM19wKCAxMDAwKX0pICU+JSANCiAgbXV0YXRlKGFuaW8gPSAxOTIyOjIwMTksDQogICAgICAgICB1bmlkYWQgPSAiVVNEL01pbGVzIGRlIG0zIikgDQoNCnByaWNlX2VldXVfTU1CVFUgPC0gIHByaWNlX2VldXUgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpe2NvbnZlcnNvcl9mdDNNTUJUVV9wKHggLzEwMDApfSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDE5MjI6MjAxOSwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvTU1CVFUiKSAgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KICANCg0KI2V1cm9zdGF0DQoNCg0KI0JQDQpicF9nYXNfcHJpY2VzIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0JQL2JwLXN0YXRzLXJldmlldy0yMDIwLWFsbC1kYXRhLnhsc3giLCANCiAgICBzaGVldCA9ICJHYXMgLSBQcmljZXMgIiwgc2tpcCA9IDMpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAuLi4xLCANCiAgICAgICAgIGJwX2xuZ19qYXBhbl9jaWYgPSBKYXBhbiwNCiAgICAgICAgIGJwX2xuZ19qa20gPSAiSmFwYW4gS29yZWEgTWFya2VyIiwNCiAgICAgICAgIGJwX2dhc19nZXJtYW5faW1wb3J0X3ByaWNlID0gIkF2ZXJhZ2UgR2VybWFuIiwNCiAgICAgICAgIGJwX2dhc19uYnAgPSBVSywNCiAgICAgICAgIGJwX2dhc19uZXRoZXJsYW5kc190dGYgPSAiTmV0aGVybGFuZHMgVFRGIiwNCiAgICAgICAgIGJwX2dhc19oZW5yeV9odWIgPSBVUywNCiAgICAgICAgIGJwX2dhc19jYW5hZGEgPSBDYW5hZGEsIA0KICAgICAgICAgYnBfb2lsX21peF9tZWFuX29lY2QgPSBPRUNEKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIGZpbHRlcighaXMubmEoYW5pbykpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvTU1CVFUiKQ0KDQpicF9nYXNfMjAxNiA8LSBicF9nYXNfcHJpY2VzICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGJwX2xuZ19qa20sIGJwX2dhc19oZW5yeV9odWIsIGJwX2dhc19uZXRoZXJsYW5kc190dGYgKSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihhbmlvID09IDIwMTYpDQoNCg0KI0ZNSQ0KZm1pX3ByaWNlcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvRk1JL1BDUFNfMDktMTYtMjAyMCAxNS0wNy0xMC02Nl90aW1lU2VyaWVzLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDM4ID0gY29sX3NraXAoKSkpDQoNCmZtaV9nYXNfcHJpY2UgPC0gZm1pX3ByaWNlcyAlPiUgDQogIGZpbHRlcihgQ29tbW9kaXR5IE5hbWVgICVpbiUgYygiTmF0dXJhbCBnYXMsIEVVIiwiTmF0dXJhbCBHYXMsIFVTIEhlbnJ5IEh1YiBHYXMiLCJMTkcsIEFzaWEiICApLA0KICAgICAgICAgYFVuaXQgTmFtZWAgPT0gIkluZGV4IikgJT4lIA0KICByZW5hbWUoY29tbW9kaXR5ID0gIkNvbW1vZGl0eSBOYW1lIiwNCiAgICAgICAgIHVuaWRhZCA9ICJVbml0IE5hbWUiKSAlPiUgDQogIGdhdGhlciguLA0KICAgICAgICAga2V5ID0gYW5pbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsIA0KICAgICAgICAgICA4Om5jb2woLikpICU+JSANCiAgc2VsZWN0KGNvbW1vZGl0eSwgYW5pbywgdmFsb3IsIHVuaWRhZCApICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgLyAxMDAsDQogICAgICAgICBhbmlvID0gYXMuZG91YmxlKGFuaW8pKSAlPiUgDQogIHNwcmVhZCguLA0KICAgICAgICAga2V5ID0gY29tbW9kaXR5LCANCiAgICAgICAgIHZhbHVlID0gdmFsb3IpICU+JSANCiAgcmVuYW1lKGZtaV9sbmdfYXNpYSA9ICJMTkcsIEFzaWEiLA0KICAgICAgICAgZm1pX25hdHVyYWxfZ2FzX2V1ID0iTmF0dXJhbCBnYXMsIEVVIiwNCiAgICAgICAgIGZtaV9oZW5yeV9odWIgPSAiTmF0dXJhbCBHYXMsIFVTIEhlbnJ5IEh1YiBHYXMiKSAlPiUgDQogIG11dGF0ZShmbWlfbG5nX2FzaWEgPSBmbWlfbG5nX2FzaWEgKiBicF9nYXNfMjAxNiRicF9sbmdfamttLA0KICAgICAgICAgZm1pX2hlbnJ5X2h1YiA9ICBmbWlfaGVucnlfaHViICogYnBfZ2FzXzIwMTYkYnBfZ2FzX2hlbnJ5X2h1YiwNCiAgICAgICAgIGZtaV9uYXR1cmFsX2dhc19ldSA9IGZtaV9uYXR1cmFsX2dhc19ldSAqIGJwX2dhc18yMDE2JGJwX2dhc19uZXRoZXJsYW5kc190dGYsDQogICAgICAgICB1bmlkYWQgPSAiVVNEL01NQlRVIikNCg0KDQojIHVuaXF1ZShmbWlfcHJpY2VzJGBDb21tb2RpdHkgTmFtZWApDQojIHVuaXF1ZShmbWlfcHJpY2VzJGBVbml0IE5hbWVgKQ0KIyB1bmlxdWUoZm1pX3ByaWNlcyRgQ291bnRyeSBOYW1lYCkNCmBgYA0KDQoNCiMjIyMjIEJvbGl2aWENCiANCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMjIyMgUHJlY2lvIGRlIGltcG9ydGFjacOzbiBkZSBCb2xpdmlhDQojUHJlY2lvIGltcG8gYm9saXZpYSByZXZpc3RhIElERUUNCnByZWNpb19pZGVlX2ltcG9fZ2FzIDwtIGN1YWRyb180LjMgICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9nYXMsIHByZWNpb19nYXNfYm9saXZpYSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzcwKSkgJT4lDQogIG11dGF0ZShwcmVjaW9fZ2FzX2JvbGl2aWFfaWRlZSA9IHByZWNpb19nYXNfYm9saXZpYSAqIGlwY183MCAvIGNvbnZlcnNvcl9wZXNvcyRgJExleWAsDQogICAgICAgICB1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdChhbmlvLCB0Y2MpKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUgPSBwcmVjaW9fZ2FzX2JvbGl2aWFfaWRlZSAvdGNjKQ0KDQoNCiNwcmVjaW8gQm9saXZpYSBZUEZCIGVuIFVTRCAob3JpZ2luYWwpDQojIGEgbTMNCnByZWNpb19leHBvX2JvbGl2aWFfdXNkX3lwZmIgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9QcmVjaW9zL3ByZWNpb19leHBvX2JvbGl2aWEueGxzeCIpICU+JQ0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ19nYXMiLCAicHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzIiksDQogICAgICAgICAgICAuZnVucyA9IGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfZnQzbTNfcCh4KX0pICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvTWlsZXMgZGUgbTMiKQ0KDQoNCiMgYSBNTSBCVFUNCnByZWNpb19leHBvX2JvbGl2aWFfdXNkX01NQlRVX3lwZmIgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9QcmVjaW9zL3ByZWNpb19leHBvX2JvbGl2aWEueGxzeCIpICU+JQ0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ19nYXMiLCAicHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzIiksDQogICAgICAgICAgICAuZnVucyA9IGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfZnQzTU1CVFVfcCh4LzEwMDApfSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9NTUJUVSIpICU+JSANCiAgcmVuYW1lKHByZWNpb19leHBvX2JvbGl2aWFfYXJnX3lwZmIgPSBwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ19nYXMsDQogICAgICAgICBwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF95cGZiID0gcHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzKSAgDQoNCg0KI3ByZWNpbyBib2xpdmlhIGVuIHBlc29zIA0KI3N1bWFybGUgZWwgZmxldGUgPSAwLjAyNDEyOTc5NA0KcHJlY2lvX2V4cG9fYm9saXZpYV9wZXNvc195cGZiIDwtICBwcmVjaW9fZXhwb19ib2xpdmlhX3VzZF95cGZiICU+JSANCiAgICBsZWZ0X2pvaW4odGNwX2FudWFsKSAlPiUNCiAgbXV0YXRlKHByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhc19wZXNvcyA9IHByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhcyAqIFRDQyAsIA0KICAgICAgICAgcHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzX3Blc29zID0gcHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzICogVENDLA0KICAgICAgICAgdW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIpDQoNCg0KI3ByZWNpbyBpbXBvIGRlIGFyZ2VudGluYSBkZXNkZSBib2xpdmlhIFVOIENvbXRyYWRlDQpnYXNfaW1wb19ib2xpdmlhX2NvbXRyYWRlX3VzZCA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvVU4gQ29tdHJhZGUvcmVzdWx0YWRvcy9nYXNfaW1wb19ib2xpdmlhX2NvbXRyYWRlLmNzdiIpICU+JQ0KICBzZWxlY3QoUGVyaW9kLCAiVHJhZGUgRmxvdyIsIFJlcG9ydGVyLCBQYXJ0bmVyLCAiQ29tbW9kaXR5IENvZGUiLCBDb21tb2RpdHksDQogICAgICAgICBRdHksIHRyYWRlX3ZhbHVlX3VzZCwgcHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWEsIHVuaWRhZF9wcmVjaW8sIHVuaWRhZF9jYW50aWRhZCkgJT4lIA0KICByZW5hbWUoYW5pbyA9IFBlcmlvZCkgJT4lIA0KICBtdXRhdGUocHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWFfTU1CVFVfY29tdHJhZGUgPSBjb252ZXJzb3JfbTNNTUJUVV9wKHByZWNpb19pbXBvX2dhc19ib2xpdmlhKSwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvTU1CVFUiKQ0KDQojcGFzYWplIGEgcGVzb3MNCmdhc19pbXBvX2JvbGl2aWFfY29tdHJhZGUgPC0gZ2FzX2ltcG9fYm9saXZpYV9jb210cmFkZV91c2QgICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUocHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWEgPSBwcmVjaW9faW1wb19nYXNfYm9saXZpYSAqIHRjYywNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8gPSAiYXJzL01pbGVzIGRlIG0zIikNCg0KDQojcHJlY2lvIGV4cG8gYm9saXZpYSBVTiBDT01UUkFERQ0KZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZV91c2QgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL1VOIENvbXRyYWRlL3Jlc3VsdGFkb3MvZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZS5jc3YiKSAlPiUNCiAgc2VsZWN0KFBlcmlvZCwgIlRyYWRlIEZsb3ciLCBSZXBvcnRlciwgUGFydG5lciwgIkNvbW1vZGl0eSBDb2RlIiwgQ29tbW9kaXR5LA0KICAgICAgICAgUXR5LCB0cmFkZV92YWx1ZV91c2QsIHByZWNpb19leHBvX2dhc19ib2xpdmlhLCB1bmlkYWRfcHJlY2lvLCB1bmlkYWRfY2FudGlkYWQpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBQZXJpb2QpICU+JSANCiAgIG11dGF0ZShwcmVjaW9fZXhwb19nYXNfYm9saXZpYV9hcmdfTU1CVFVfY29tdHJhZGUgPSBjb252ZXJzb3JfbTNNTUJUVV9wKHByZWNpb19leHBvX2dhc19ib2xpdmlhKSwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvTU1CVFUiKQ0KDQojcGFzYWplIGEgcGVzb3MNCmdhc19leHBvX2JvbGl2aWFfY29tdHJhZGUgPC0gIGdhc19leHBvX2JvbGl2aWFfY29tdHJhZGVfdXNkICU+JQ0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fZXhwb19nYXNfYm9saXZpYSA9IHByZWNpb19leHBvX2dhc19ib2xpdmlhICogdGNjLA0KICAgICAgICAgdW5pZGFkX3ByZWNpbyA9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KYGBgDQoNCiMjIyMjIFRvZG9zIGxvcyBwcmVjaW9zDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1ByZWNpbyBkZSBleHBvcnRhY2lvbiB5IHJlZmVyZW5jaWEgZGUgR2FzLiBNZXJnZSBkZSBiYXNlcw0KDQojcHJlY2lvcyBlbiB1c2QNCnByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSA8LSBwcmljZV9lZXV1X01NQlRVICU+JSANCiAgbGVmdF9qb2luKCAgaGVucnlfaHViKSAlPiUNCiAgbGVmdF9qb2luKGJwX2dhc19wcmljZXMpICU+JSANCiAgbGVmdF9qb2luKGZtaV9nYXNfcHJpY2UpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19leHBvX2JvbGl2aWFfdXNkX01NQlRVX3lwZmIpICU+JSANCiAgbGVmdF9qb2luKGdhc19pbXBvX2JvbGl2aWFfY29tdHJhZGVfdXNkICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2ltcG9fZ2FzX2FyZ19ib2xpdmlhX2NvbXRyYWRlID0gcHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWFfTU1CVFVfY29tdHJhZGUpKSAlPiUgDQogIGxlZnRfam9pbihnYXNfZXhwb19ib2xpdmlhX2NvbXRyYWRlX3VzZCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIA0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWFfYXJnX2NvbXRyYWRlID0gcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWFfYXJnX01NQlRVX2NvbXRyYWRlKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX2lkZWVfaW1wb19nYXMgJT4lIHNlbGVjdChhbmlvLCBwcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUpKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fZXhwb19nYXNfdXNkKSAlPiUgDQogIG11dGF0ZShwcmVjaW9faW1wb19nYXNfYm9saXZpYV9pZGVlID0gY29udmVyc29yX20zTU1CVFVfcChwcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUvMTAwMCksI29rDQogICAgICAgICBwcmVjaW9fZXh0ZXJub19nYXMgPSBjYXNlX3doZW4oIGFuaW8gPCAxOTY2IH4gcHJlY2lvX2ltcG9fZ2FzX2FyZ19ib2xpdmlhX2NvbXRyYWRlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUfiBwcmVjaW9fZXhwb19nYXNfYm9saXZpYV9hcmdfY29tdHJhZGUpLA0KICAgICAgICAgcHJlY2lvX2V4cG9ydGFjaW9uX2dhc19hciA9IGNhc2Vfd2hlbihhbmlvIDwxOTk5IH5wcmVjaW9fZXhwb19nYXNfY29tdHJhZGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk5OSB+IHByZWNpb19leHBvX2dhc19yZWdhbGlhcykpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2V4dGVybm9fZ2FzLCBldmVyeXRoaW5nKC4pLCAtcHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KcHJlY2lvX21kb211bmRpYWxfZ2FzX2JlcCA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lDQogIHNlbGVjdCgtdW5pZGFkKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgbXV0YXRlX2FsbChjb252ZXJzb3JfTU1CVFViZXBfcCkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9iZXAiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpDQoNCmNvbXBhcmFjaW9uX2JlcCA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfYmVwICU+JSANCiAgICAjIHNlbGVjdChhbmlvLCBwcmVjaW9fZXh0ZXJub19nYXMpICU+JQ0KICBsZWZ0X2pvaW4ocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBicmVudF9oaXN0b3JpYywgd3RpX3Nwb3RfcHJpY2VfZnJlZCwNCiAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHBvX2NvbXRyYWRlX3NpdGNfY3J1ZG8pKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL2JlcCIpDQogIA0KIyBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTW0zIDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSAlPiUNCiMgICBzZWxlY3QoLXVuaWRhZCkgJT4lIA0KIyAgIGdyb3VwX2J5KGFuaW8pICU+JSANCiMgICBtdXRhdGVfYWxsKGNvbnZlcnNvcl9tM01NQlRVX3ApICU+JSANCiMgICBtdXRhdGUodW5pZGFkID0gIlVTRC9iZXAiKSAlPiUgDQojICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCiAgDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KE1NQlRVID0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIEJFUCA9IHByZWNpb19tZG9tdW5kaWFsX2dhc19iZXApLCBwYXRoID0gInJlc3VsdGFkb3MvcHJlY2lvX21kb19tdW5kaWFsX2dhcy54bHN4IikNCg0KI2dyYWZpY28gcHJlY2lvcyBiZXANCmdyYWZfcHJlY2lvX21kb19tdW5kaWFsX2dhc19iZXAgPC0gcHJlY2lvX21kb211bmRpYWxfZ2FzX2JlcCAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX2V4dGVybm9fZ2FzKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOm5jb2woLikpICU+JQ0KICAjIGZpbHRlcighKHRpcG9fcHJlY2lvICVpbiUgYygicHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlIiwgInByZWNpb19pbXBvX2dhc19ib2xpdmlhX01NQlRVX2NvbXRyYWRlIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWNpb19leHBvX2dhc19jb210cmFkZSIsICJwcmVjaW9fZXhwb19nYXNfaW5kZWMiKSkpICU+JQ0KICBmaWx0ZXIoISh0aXBvX3ByZWNpbyAlaW4lIGMoInByZWNpb19leHBvX2dhc19pbmRlYyIpKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBhbmlvLCB5ID0gdmFsb3IsIGNvbG9yID0gdGlwb19wcmVjaW8pKSsNCiAgZ2VvbV9saW5lKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnMoeSA9ICJVU0QvYmVwIikNCiMgcGxvdGx5OjpnZ3Bsb3RseShncmFmX3ByZWNpb19tZG9fbXVuZGlhbF9nYXNfYmVwKQ0KDQpncmFmX3ByZWNpb19tZG9fbXVuZGlhbF9nYXNfbW1idHUgPC0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVICU+JSANCiAgZmlsdGVyKHByZWNpb19leHRlcm5vX2dhcyA8IDI1KSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOm5jb2woLikpICU+JQ0KICBmaWx0ZXIoDQogICAgdmFsb3IgPCAyNSwNCiAgICAhKHRpcG9fcHJlY2lvICVpbiUgYygiYnBfb2lsX21peF9tZWFuX29lY2QiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICwgInByZWNpb19leHBvX2dhc19pbmRlYyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgInByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJwcmVjaW9faW1wb19nYXNfYXJnX2JvbGl2aWFfY29tdHJhZGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAicHJlY2lvX2V4cG9fZ2FzX2NvbXRyYWRlIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpICU+JQ0KICAjIGZpbHRlcighKHRpcG9fcHJlY2lvICVpbiUgYygicHJlY2lvX2V4cG9fZ2FzX2luZGVjIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGFuaW8sIHkgPSB2YWxvciwgY29sb3IgPSB0aXBvX3ByZWNpbykpKw0KICBnZW9tX2xpbmUoKSArDQogICMgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSsNCiAgbGFicyh0aXRsZSA9ICJQcmVjaW9zIGRlIGV4cG9ydGFjacOzbiB5IHJlZmVyZW5jaWEgZGVsIG1lcmNhZG8gbXVuZGlhbCBkZWwgZ2FzIiwgDQogICAgICAgeSA9ICJVU0QvTU1CVFUiKQ0KZ2dwbG90bHkoZ3JhZl9wcmVjaW9fbWRvX211bmRpYWxfZ2FzX21tYnR1LCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KDQoNCiNwcmVjaW9zIGVuIGFycy4gSU5DT01QTEVUTw0KcHJlY2lvX2V4cG9feV9tZV9nYXMgPC0gcHJlY2lvX2V4cG9fZ2FzICU+JQ0KICBmdWxsX2pvaW4ocHJlY2lvX2lkZWVfaW1wb19nYXMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZ2FzX2JvbGl2aWFfaWRlZSkpICU+JSANCiAgZnVsbF9qb2luKHByZWNpb19leHBvX2JvbGl2aWFfcGVzb3NfeXBmYiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIA0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2JvbGl2aWFfeXBmYiA9IHByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhc19wZXNvcyApKSAlPiUgDQogIGZ1bGxfam9pbihnYXNfaW1wb19ib2xpdmlhX2NvbXRyYWRlICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9wcmVjaW8sDQogICAgICAgICAgICAgICAgICAgICBwcmVjaW9faW1wb19nYXNfYm9saXZpYV9jb210cmFkZSA9IHByZWNpb19pbXBvX2dhc19ib2xpdmlhICkpICU+JSANCiAgbGVmdF9qb2luKGdhc19leHBvX2JvbGl2aWFfY29tdHJhZGUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ByZWNpbywgDQogICAgICAgICAgICAgICAgICAgICBwcmVjaW9fZXhwb19nYXNfYm9saXZpYV9jb210cmFkZSA9IHByZWNpb19leHBvX2dhc19ib2xpdmlhICkpICU+JQ0KICBsZWZ0X2pvaW4oaGVucnlfaHViKSAlPiUgDQogIGFycmFuZ2UoYW5pbykNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb19leHBvX3lfbWVfZ2FzLCBwYXRoID0gInByZWNpb19leHBvX3lfbWRvX211bmRpYWxfZ2FzLnhsc3giKQ0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGNvbXBhcmFjaW9uX2JlcCwgcGF0aCA9ICJjb21wYXJhY2lvbl9iZXAueGxzeCIpDQoNCg0KY29tcGFyYWNpb25fcHJlY2lvcyA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZXh0ZXJub19nYXMpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZ2FzX21kb2ludCkpDQogDQpgYGANCmJ1c2NhbW9zIHVuIHByZWNpbw0KDQpjdWFudG8gZXMgdW5hIGNhbnRpZGFkIGRlIGJ0dSBkZSBnYXMgYWwgcHJlY2lvIGRlIHJlZmVyZW5jaWEgKGVqIGJvbGl2aWEpIHkgY3VhbnRvIGVzIHNpIGNvbnZpZXJ0byBlc29zIGJ0dSBhIGJhcnJpbGVzIHkgbG9zIHZhbG9yaXpvIGNvbiBlbCBwcmVjaW8gZGVsIGJhcnJpbD8gY3VhbnRvIHF1ZWRhIGxhIHVuaWRhZCBlbiBidHUgc2kgdG9tbyBlbCBwcmVjaW8gZGUgcGV0cm9sZW8geSBsbyBjb3ZpZXJ0byBhIGJ0dS4gDQplcyBkZWNpciwgY3VhbnRvIGVzIGVsIHZhbG9yIHNpIGxhIHZhbG9yaXpvIGVuIHByZWNpbyBkZWwgcGV0cm9sZW8NCg0Kwr9jdWFudG9zIHVzZCBlcyB1biBidHUgZGUgcGV0cm9sZW8/DQpzaSB0b21vIHVuIGJhcnJpbCBkZSBwZXRyb2xlbyB5IGxvIGNvbnZpZXJ0byBhIGJ0dSAoIG1lIHZhIGEgZGFyIGN1YW50b3MgVVNEIGVzIHVuIGJ0dSkNCmx1ZWdvIGNvbXBhcm8gbG9zIFVTRC9idHUgeSBsbyBjb21wYXJvIGNvbiBlbCBnYXMgZGUgYm9saXZpYQ0KDQpncmluYmVyOiBjb252aWVydGUgdG9kbyBlbCBnYXMgZW4gcGV0cm9sZW8geSBsZSBwb25lIGVsIHByZWNpbyBkZSBwZXRyb2Vsb2UuIHN1YmVzdGltYSBsb3MgcHJlY2lvcyBkZWwgZ2FzPw0KDQpgYGB7cn0NCnByZWNpb19jcnVkb192c19nYXMgPC0gcHJlY2lvX21kb211bmRpYWxfZ2FzX2JlcCAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19leHRlcm5vX2dhcykgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtdW5pZGFkKSAlPiUgDQogICAgICAgICAgICAgIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpb19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlICAgPSBwcmVjaW9fY3J1ZG9fdXNkX2JibCwNCiAgICAgICAgICAgICAgICAgICAgIDI6bmNvbCguKSksIGJ5ID0iYW5pbyIpICU+JSANCiAgbXV0YXRlKHByZWNpb19jcnVkb19zb2JyZV9nYXMgPXByZWNpb19jcnVkb191c2RfYmJsL3ByZWNpb19leHRlcm5vX2dhcykgJT4lIA0KICBmaWx0ZXIoIShpcy5uYShwcmVjaW9fY3J1ZG9fc29icmVfZ2FzKSksIA0KICAgICAgICAgISh0aXBvX3ByZWNpb19jcnVkbyAlaW4lIGMoInd0aV9zcG90X3ByaWNlX2ZyZWQiLCAicHJlY2lvX21lX2NydWRvIikpICApDQogICAgICAgICAjICh0aXBvX3ByZWNpb19jcnVkbyAlaW4lIGMoImJyZW50X2llYSIpKSAgKQ0KICAgICAgICAgIyAodGlwb19wcmVjaW9fY3J1ZG8gJWluJSBjKCJicmVudF9pZWEiLCAiYnJlbnRfaGlzdG9yaWMiKSkgICkNCnByZWNpb19jcnVkb192c19nYXMNCg0KZ3JhZiA8LSAgcHJlY2lvX2NydWRvX3ZzX2dhcyAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgcHJlY2lvX2NydWRvX3NvYnJlX2dhcywgY29sb3I9dGlwb19wcmVjaW9fY3J1ZG8pKSsNCiAgZ2VvbV9saW5lKCkrDQogIGxhYnModGl0bGUgPSAicHJlY2lvIGRlbCBjcnVkbyBzb2JyZSBlbCBkZWwgZ2FzIChhbWJvcyBlbiBiYXJyaWxlcykiKQ0KDQpnZ3Bsb3RseShncmFmLCB3aWR0aCA9IDgwMCwgbGVuZ3RoPTYwMCkNCiMgZ3JhZg0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX2NydWRvX3ZzX2dhcywgcGF0aD0gInByZWNpbyBkZWwgY3J1ZG8gdnMgZ2FzLnhsc3giKSAgDQpgYGANCg0KDQoNCiMjIEV4cG9ydGFjaW9uZXMgZSBJbXBvcnRhY2lvbmVzDQoNCiogRnVlbnRlcw0KICArIFtTRVNDTyBEb3duc3RyZWFtXShodHRwczovL2RhdG9zLmdvYi5hci9kYXRhc2V0L2VuZXJnaWEtcmVmaW5hY2lvbi1jb21lcmNpYWxpemFjaW9uLXBldHJvbGVvLWdhcy1kZXJpdmFkb3MtdGFibGFzLWRpbmFtaWNhcykNCiAgKyBJTkRFQw0KICArIE1FQ09ODQogICsgVU5Db210cmFkZQ0KDQojIyMjIEV4cG9ydGFjaW9uZXMgZSBJbXBvcnRhY2lvbmVzIGRlIENydWRvDQoqIEV4cG9ydGFjaW9uZXMgZGUgQ3J1ZG86IA0KICArIDE5NjIgYSAxOTkzOiBVTiBDb210cmFkZQ0KICArIDE5OTQgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCiAgKyBMb3MgZGF0b3MgZmFsdGFudGVzIGRlIFNFU0NPIHNlIGNvbXBsZXRhcm9uIGNvbiBNRUNPTg0KICArIFNpZ3VlbiBoYWJpZW5kbyBkYXRvcyBmYWx0YW50ZXMgcGFyYSBsb3MgYcOxb3MgMTk2NSwgMTk3MC03NCwgMTk3Ni03OCwgMTk4MC04NA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIFNFU0NPDQojY2FudGlkYWRlcy4gcG9zdCAyMDEwIChoYXN0YSAyMDE5KQ0KaW1wb3J0YWNpb25lc19leHBvcnRhY2lvbmVzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1NFU0NPL1JlZmluYWNpw7NuIHkgY29tZXJjaWFsaXphY2lvbi9pbXBvcnRhY2lvbmVzLWV4cG9ydGFjaW9uZXMuY3N2IikNCg0KIyBjYW50aWRhZGVzLiBwb3N0IDIwMTYgDQppbXBvcnRhY2lvbmVzX2V4cG9ydGFjaW9uZXNfcG9zdDIwMTYgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vUmVmaW5hY2nDs24geSBjb21lcmNpYWxpemFjaW9uL2ltcG9ydGFjaW9uZXMtZXhwb3J0YWNpb25lcy1hLXBhcnRpci1kZWwtMjAxNi0uY3N2IikNCg0KIyMjI2NvbWVyY2lvIGV4dGVyaW9yIHBvc3QgMjAxMDogIlREX2NvbWVyY2lvX2V4dGVyaW9yLnhsc3giDQpjb21leF9wb3N0MjAxMCA8LSByZWFkX2RlbGltKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9jb21leF9wb3N0MjAxMC5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUsIA0KICAgIHNraXAgPSA1KSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSBjYXNlX3doZW4oRGF0b3MgPT0gIlN1bWEgZGUgbW9udG8iIH4gIlVTRCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHVuaWRhZCksDQogICAgICAgICAJdW5pZGFkID0gc3RyX3JlbW92ZV9hbGwoCXVuaWRhZCwgIlsoKV0iICksDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBtZXMpLCBvcmRlcnMgPSAieW0iKSkpICU+JSAgDQogIGZpbHRlcighaXMubmEoYW5pbykpICU+JSANCiAgcmVuYW1lKGV4cG9ydGFjaW9uID0gIkV4cG9ydGFjacOzbiIsDQogICAgICAgICBpbXBvcnRhY2lvbiA9ICJJbXBvcnRhY2nDs24iKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgYW5pbywgbWVzLCBldmVyeXRoaW5nKC4pLCAtYygiVG90YWwgZ2VuZXJhbCIsIERhdG9zKSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDY6NykNCg0KI290cmEgYmFzZS4gc29sbyBjYW50aWRhZGVzLiB2ZXIgZGUgZG9uZGUgYXBhcmVjacOzDQppbXBvX2V4cG8gPC0gcmVhZF9jc3YoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL2ltcG9ydGFjaW9uZXMtZXhwb3J0YWNpb25lcyAoMSkuY3N2IikNCg0KDQojIyNleHBvcnRhY2lvbmVzIHByZSAyMDEwOiAiRXhwb3J0YWNpb25lcy54bHN4Ig0KZXhwb19wcmUyMDEwIDwtIHJlYWRfZGVsaW0oIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL2V4cG9fcHJlMjAxMC5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcOxbyIsDQogICAgICAgICBtZXMgPSAiTWVzIiwNCiAgICAgICAgIHByb2R1Y3RvID0gUHJvZHVjdG8sDQogICAgICAgICB2YWxvciA9IFRvdGFsKSAlPiUgDQogIG11dGF0ZShhbmlvID0gem9vOjpuYS5sb2NmKGFuaW8pLA0KICAgICAgICAgbWVzID0gem9vOjpuYS5sb2NmKG1lcyksDQogICAgICAgICBwcm9kdWN0byA9IHpvbzo6bmEubG9jZihwcm9kdWN0byksDQogICAgICAgICB2YXJpYWJsZSA9ICJleHBvcnRhY2lvbiIsDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBtZXMpLCBvcmRlcnMgPSAieW0iKSksDQogICAgICAgICB1bmlkYWQgPSBjYXNlX3doZW4oc3RyX2RldGVjdChEYXRvcywgIk0zIikgfiAibTMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoRGF0b3MsICJUb24iKSB+ICJ0b24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoRGF0b3MsICJGT0IiKSB+ICJVU0QiKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGV2ZXJ5dGhpbmcoLiksIC1jKERhdG9zKSkNCg0KI25vIHNlIGRlIGRvbmRlIHNhbGnDsyBlc3RlIHBlcm8gaGFicmlhIHEgcmFzdHJlYXJsbw0KZXhwb191c2RfdG9uIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvZXhwb191c2RfdG9uLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSwgDQogICAgc2tpcCA9IDMpDQoNCiMjI2ltcG9ydGFjaW9uZXMgcHJlIDIwMTA6ICJJbXBvcnRhY2lvbmVzLnhsc3giDQppbXBvX3ByZTIwMTAgPC0gcmVhZF9kZWxpbSgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvaW1wb19wcmUyMDEwLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgIG1lcyA9ICJNZXMiLA0KICAgICAgICAgcHJvZHVjdG8gPSBQcm9kdWN0bywNCiAgICAgICAgIHZhbG9yID0gVG90YWwpICU+JSANCiAgbXV0YXRlKGFuaW8gPSB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBtZXMgPSB6b286Om5hLmxvY2YobWVzKSwNCiAgICAgICAgIHByb2R1Y3RvID0gem9vOjpuYS5sb2NmKHByb2R1Y3RvKSwNCiAgICAgICAgIHZhcmlhYmxlID0gImltcG9ydGFjaW9uIiwNCiAgICAgICAgIGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIG1lcyksIG9yZGVycyA9ICJ5bSIpKSwNCiAgICAgICAgIHVuaWRhZCA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KERhdG9zLCAiTTMiKSB+ICJtMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChEYXRvcywgIlRvbiIpIH4gInRvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChEYXRvcywgIkZPQiIpIH4gIlVTRCIpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgZXZlcnl0aGluZyguKSwgLWMoRGF0b3MpKQ0KIyBpbXBvX3ByZTIwMTANCg0KDQojQmFzZSB1bmlkYSBkZSBTRVNDTw0KY29tZXJjaW9fZXh0ZXJpb3IgPC0gY29tZXhfcG9zdDIwMTAgJT4lIA0KICBiaW5kX3Jvd3MoaW1wb19wcmUyMDEwLCBleHBvX3ByZTIwMTApICU+JSANCiAgYXJyYW5nZShmZWNoYSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSBjYXNlX3doZW4odW5pZGFkID09ICJtaWxlcy9tMyIgfiB2YWxvciAqIDEwMDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdmFsb3IpLA0KICAgICAgICAgdW5pZGFkID0gY2FzZV93aGVuKHVuaWRhZCA9PSAibWlsZXMvbTMiIH4gIm0zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdW5pZGFkKSkNCg0KI2V4cG8gZSBpbXBvIGRlIENydWRvLiBjYW50aWRhZGVzIHkgdmFsb3INCmNvbWV4X2NydWRvX3Nlc2NvIDwtIGNvbWVyY2lvX2V4dGVyaW9yICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QocHJvZHVjdG8sICJQRVRST0xFTyIpIHwgc3RyX2RldGVjdChwcm9kdWN0bywgIkN1ZW5jYSIpLA0KICAgICAgICAgdW5pZGFkICE9ICJUb24iKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHZhcmlhYmxlLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKHZhbG9yID0gc3VtKHZhbG9yLCBuYS5ybSA9IFQpKSAlPiUgDQogIG11dGF0ZShwcm9kdWN0byA9ICJjcnVkbyIsDQogICAgICAgICB2YWxvciA9IGNhc2Vfd2hlbih1bmlkYWQgPT0gIm0zIiB+IGNvbnZlcnNvcl9tM2JibF9xKHZhbG9yKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YWxvciksDQogICAgICAgICB1bmlkYWQgPSBjYXNlX3doZW4odW5pZGFkID09ICJtMyIgfiAiYmFycmlsZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB1bmlkYWQpKQ0KDQoNCiNxdcOpIHByb2R1Y3RvcyBlbnRyYW4gZW4gZWwgZmlsdHJvIGRlIGNydWRvPw0KIyB1bmlxdWUoKGNvbWVyY2lvX2V4dGVyaW9yICU+JSBmaWx0ZXIoc3RyX2RldGVjdChwcm9kdWN0bywgIlBFVFJPTEVPIikgfCBzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiQ3VlbmNhIikpKSRwcm9kdWN0bykNCg0KDQojTUVDT04NCmNvbWV4X2hpZHJvY2FyYnVyb3NfbWVjb24gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9iYXNlLW1pbmVyaWEtZS1oaWRyb2NhcmJ1cm9zIGN1ZW50YXMgbmFjaW9uYWxlcy54bHMiLCANCiAgICBzaGVldCA9ICJDb20uIGV4dGVyaW9yIiwgc2tpcCA9IDcpICU+JQ0KICByZW5hbWUoYW5pbyA9ICcuLi4xJyAsDQogICAgICAgICBleHBvX01tM19jcnVkbyA9ICdFeHBvcnRhY2lvbmVzLi4uMicsDQogICAgICAgICBpbXBvX01tM19jcnVkbyA9ICdJbXBvcnRhY2lvbmVzLi4uMycsDQogICAgICAgICBzYWxkb19NbTNfY3J1ZG8gPSBgQmFsYW5jZSAoWC1NKS4uLjRgLA0KICAgICAgICAgZXhwb19NTW0zX2dhcyA9ICdFeHBvcnRhY2lvbmVzLi4uNScsDQogICAgICAgICBpbXBvX01tM19nYXMgPSAnSW1wb3J0YWNpb25lcy4uLjYnLA0KICAgICAgICAgc2FsZG9fTW0zX2dhcyA9IGBCYWxhbmNlIChYLU0pLi4uN2AsDQogICAgICAgICBleHBvX21ldGFsaWZlcm9zX290cm9zX01NdXNkID0gYE1pbmVyYWxlcyBtZXRhbMOtZmVyb3MsIGVzY29yaWFzIHkgY2VuaXphc2AsDQogICAgICAgICBleHBvX2NydWRvX01NdXNkID0gYFBldHLDs2xlbyBjcnVkb2AsDQogICAgICAgICBleHBvX2dhc19NTXVzZCA9IGBHYXMgZGUgcGV0csOzbGVvIHkgb3Ryb3MgaGlkcm9jYXJidXJvc2AsDQogICAgICAgICBleHBvX2NhcmJ1cmFudGVzX290cm9zX01NdXNkID0gYENhcmJ1cmFudGVzLCBncmFzYXMgeSBhY2VpdGVzIGx1YnJpY2FudGVzYCwNCiAgICAgICAgIGV4cG9fZWxlY3RyaWNhX01NdXNkID0gYEVuZXJnw61hIGVsw6ljdHJpY2FgLA0KICAgICAgICAgZXhwb19yZXN0b19jb21idXN0aWJsZXNfTU11c2QgPSBgUmVzdG8gZGUgY29tYnVzdGlibGVzYCkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGFuaW8gKSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICBtdXRhdGUoZXhwb19iYmxfY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcShleHBvX01tM19jcnVkbyoxMDAwKSwNCiAgICAgICAgIGltcG9fYmJsX2NydWRvID0gY29udmVyc29yX20zYmJsX3EoaW1wb19NbTNfY3J1ZG8qMTAwMCksDQogICAgICAgICBzYWxkb19iYmxfY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcShzYWxkb19NbTNfY3J1ZG8qMTAwMCkpDQoNCg0KI0lOREVDIC0gQ29tRXgNCiNjYW50aWRhZGVzDQpjYW50aWRhZGVzX2V4cG9faGlkcm9faW5kZWMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0lOREVDL0NvbUV4L2NhbnRpZGFkZXNfZXhwb19oaWRyb19pbmRlYy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JSANCiAgcmVuYW1lKGV4cG9faW5kZWNfY3J1ZG8gPSBwZXRyb2xlb19jcnVkb19leHBvLA0KICAgICAgICAgICBleHBvX2luZGVjX2dhcyAgPSBnYXNfbmF0dXJhbF9leHBvKQ0KDQojdmFsb3INCmV4cG9faGlkcm9fdmFsb3JfaW5kZWMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0lOREVDL0NvbUV4L2V4cG9faGlkcm9fdmFsb3IuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUgDQogIHJlbmFtZShleHBvX2luZGVjX2NydWRvID0gcGV0cm9sZW9fY3J1ZG9fZXhwbywNCiAgICAgICAgICAgZXhwb19pbmRlY19nYXMgID0gZ2FzX25hdHVyYWxfZXhwbykNCg0KDQoNCiNNZXJnZSBkZSBiYXNlcw0KI0NydWRvIGV4cG8gY2FudGlkYWQNCmV4cG9fcV9jcnVkbyA8LSBjb21leF9jcnVkb19zZXNjbyAlPiUNCiAgZmlsdGVyKHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIsDQogICAgICAgICB1bmlkYWQgPT0gImJhcnJpbGVzIikgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHZhbG9yKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHJlbmFtZShleHBvX3Nlc2NvX2NydWRvID0gdmFsb3IpICU+JSANCiAgbGVmdF9qb2luKGNvbWV4X2hpZHJvY2FyYnVyb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19tZWNvbl9jcnVkbyA9IGV4cG9fYmJsX2NydWRvKSkgJT4lIA0KICBsZWZ0X2pvaW4oY2FudGlkYWRlc19leHBvX2hpZHJvX2luZGVjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC1leHBvX2luZGVjX2dhcykpICU+JSANCiAgZnVsbF9qb2luKGV4cG9fY3J1ZG9fc2l0YyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfY2FudGlkYWQsIGV4cG9fY29tdHJhZGVfY3J1ZG8gPSBleHBvX2JibCApKSAlPiUgDQogIG11dGF0ZShleHBvX2NydWRvID0gY2FzZV93aGVuKGFuaW8gPCAxOTk5ICB+IGV4cG9fY29tdHJhZGVfY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW5pbyAlaW4lIDE5OTk6MjAxNCB+IGV4cG9fbWVjb25fY3J1ZG8gLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID49IDE5OTkgfiBleHBvX3Nlc2NvX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKGV4cG9fc2VzY29fY3J1ZG8pIH4gZXhwb19tZWNvbl9jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGV4cG9fc2VzY29fY3J1ZG8pLA0KICAgICAgICAgdW5pZGFkID0gImJhcnJpbGVzIikgJT4lICMsDQogICAgICAgICAjIGRpZiA9IGV4cG9fY3J1ZG8vZXhwb19pbmRlY19jcnVkbyAtIDEpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCxleHBvX2NydWRvLCBldmVyeXRoaW5nKC4pLCAtdmFyaWFibGUpICU+JSANCiAgYXJyYW5nZShhbmlvKQ0KDQoNCiMgTWVyZ2UgY3J1ZG8gVVNEDQpleHBvX3VzZF9jcnVkbyA8LSBjb21leF9jcnVkb19zZXNjbyAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iICwgdW5pZGFkID09ICJVU0QiKSAlPiUgDQogIHJlbmFtZShleHBvX2NydWRvX3Nlc2NvID0gdmFsb3IpICU+JQ0KICBsZWZ0X2pvaW4oY29tZXhfaGlkcm9jYXJidXJvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2NydWRvX21lY29uID0gZXhwb19jcnVkb19NTXVzZCkpICU+JSANCiAgbGVmdF9qb2luKGV4cG9faGlkcm9fdmFsb3JfaW5kZWMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19pbmRlY19jcnVkbykpICU+JSANCiAgZnVsbF9qb2luKGV4cG9fY3J1ZG9fc2l0YyAlPiUgDQogICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ZhbG9yLCBleHBvX2NvbXRyYWRlX2NydWRvID0gZXhwb191c2RfY29tdHJhZGVfY3J1ZG8pKSAlPiUNCiAgbXV0YXRlKGV4cG9fY3J1ZG9fbWVjb24gPSBleHBvX2NydWRvX21lY29uICoxMDAwMDAwLA0KICAgICAgICAgZXhwb19jcnVkbyA9IGNhc2Vfd2hlbihhbmlvIDwxOTk0IH4gZXhwb19jb210cmFkZV9jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+PSAxOTk0IH4gZXhwb19jcnVkb19zZXNjbykpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhwb19jcnVkbywgZXZlcnl0aGluZyguKSwgLWModmFyaWFibGUsIHByb2R1Y3RvKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3gvMTBeNn0pDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KHVzZCA9IGV4cG9fdXNkX2NydWRvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAjIGNhbnRpZGFkZXMgPSBleHBvX3FfY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmVjaW9fZXhwb3J0YWNpb25feV9yZWZlcmVuY2lhID0gcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyksIA0KICAgICAgICAgICAgICAgICAgICAjIHBhdGggPSAiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9yZXN1bHRhZG9zL2V4cG9fY3J1ZG8ueGxzeCIpDQoNCmV4cG9fcV9jcnVkbw0KZXhwb191c2RfY3J1ZG8NCmBgYA0KDQoNCiMjIyMgRXhwb3J0YWNpb25lcyBlIEltcG9ydGFjaW9uZXMgZGUgR2FzDQoqIEZ1ZW50ZXMgc2VsZWNjaW9uYWRhczoNCiArIDE5NjIgYSAxOTk2OiBVTiBDb210cmFkZSwNCiArIDE5OTcgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCiArIERhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyAxOTk5IHkgMjAwMA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1NFU0NPDQpjb21leF9nYXMgPC0gY29tZXJjaW9fZXh0ZXJpb3IgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChwcm9kdWN0bywgIkdBUyBOQVRVUkFMIikgfCBzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiR2FzIE5hdHVyYWwiKSANCiAgICAgICAgIHwgc3RyX2RldGVjdChwcm9kdWN0bywgIkdhcyBkZSBSZWZpbmVyw61hIiksDQogICAgICAgICBwcm9kdWN0byAhPSAiR2FzIE5hdHVyYWwgTGljdWFkbyIsDQogICAgICAgICB1bmlkYWQgIT0gIlRvbiIpICU+JQ0KICBncm91cF9ieShhbmlvLCB2YXJpYWJsZSwgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZSh2YWxvciA9IHN1bSh2YWxvciwgbmEucm0gPSBUKSklPiUgDQogIG11dGF0ZShwcm9kdWN0byA9ICJnYXMiKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdChjb21leF9jcnVkb19zZXNjbyAlPiUgZmlsdGVyKHVuaWRhZCA9PSAiVVNEIiwgdmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIiksDQojICAgICAgICAgICAgICAgICAgICAgICAgICBjb21leF9jcnVkb19zZXNjbyAlPiUgZmlsdGVyKHVuaWRhZCA9PSAiVVNEIiwgdmFyaWFibGUgPT0gImltcG9ydGFjaW9uIiksDQojICAgICAgICAgICAgICAgICAgICAgICAgICBjb21leF9nYXMgJT4lIGZpbHRlcih1bmlkYWQgPT0gIlVTRCIsIHZhcmlhYmxlID09ICJpbXBvcnRhY2lvbiIpLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tZXhfZ2FzICU+JSBmaWx0ZXIodW5pZGFkID09ICJVU0QiLCB2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iKSksIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAiY29tZXhfc2VzY28ueGxzeCIpDQoNCiNFeHBvIGdhcyBTRVNDTyBjYW50aWRhZGVzDQpleHBvX3Nlc2NvX3FfZ2FzIDwtIGNvbWV4X2dhcyAgJT4lDQogIGZpbHRlcih2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iLA0KICAgICAgICAgdW5pZGFkID09ICJtMyIpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KC1jKHZhcmlhYmxlLCBwcm9kdWN0bykpICU+JQ0KICByZW5hbWUoZXhwb19zZXNjb19nYXMgPSB2YWxvcikgJT4lDQogIG11dGF0ZShleHBvX3Nlc2NvX2dhcyA9IHJlcGxhY2VfbmEoZXhwb19zZXNjb19nYXMsIDAgKSwNCiAgICAgICAgIGV4cG9fc2VzY29fZ2FzID0gZXhwb19zZXNjb19nYXMgLyAxMDAwLA0KICAgICAgICAgdW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KI2V4cG8gc2VzY28gZ2FzIHZhbG9yDQpleHBvX3Nlc2NvX3VzZF9nYXMgPC0gY29tZXhfZ2FzICAlPiUNCiAgZmlsdGVyKHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIsDQogICAgICAgICB1bmlkYWQgPT0gIlVTRCIpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KC1jKHZhcmlhYmxlLCBwcm9kdWN0bykpICU+JQ0KICByZW5hbWUoZXhwb19zZXNjb19nYXMgPSB2YWxvcikgJT4lDQogIG11dGF0ZShleHBvX3Nlc2NvX2dhcyA9IHJlcGxhY2VfbmEoZXhwb19zZXNjb19nYXMsIDAgKSkNCg0KDQojZXhwbyBVTiBDb210cmFkZQ0KZXhwb19nYXNfc2l0YyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvVU4gQ29tdHJhZGUvcmVzdWx0YWRvcy9leHBvX2dhc19zaXRjLmNzdiIpICAlPiUgDQogIHJlbmFtZSh0cmFkZV92YWx1ZV91c2QgPSAiVHJhZGUgVmFsdWUgKFVTJCkiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEIiwNCiAgICAgICAgIGV4cG9fTW0zID0gZXhwb19NbTMgLzEwMDAsDQogICAgICAgICB1bmlkYWRfY2FudGlkYWQgPSAgIk1pbGVzIGRlIG0zIikNCg0KDQojTWVyZ2UgY2FudGlkYWRlcw0KZXhwb19xX2dhcyA8LSAgZXhwb19zZXNjb19xX2dhcyAlPiUgDQogIGxlZnRfam9pbihjb21leF9oaWRyb2NhcmJ1cm9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fZ2FzX21lY29uID0gZXhwb19NTW0zX2dhcykgJT4lDQogICAgICAgICAgICAgIG11dGF0ZSh1bmlkYWQgPSAiTWlsZXMgZGUgbTMiLA0KICAgICAgICAgICAgICAgICAgICAgZXhwb19nYXNfbWVjb24gPSBleHBvX2dhc19tZWNvbiAqIDEwMDApICkgJT4lIA0KICBsZWZ0X2pvaW4oY2FudGlkYWRlc19leHBvX2hpZHJvX2luZGVjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC1leHBvX2luZGVjX2NydWRvKSkgJT4lIA0KICBmdWxsX2pvaW4oZXhwb19nYXNfc2l0YyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fZ2FzX2NvbXRyYWRlID0gZXhwb19NbTMsIHVuaWRhZCA9IHVuaWRhZF9jYW50aWRhZCApKSAlPiUgDQogICMgbXV0YXRlKGRpZiA9IGV4cG9fc2VzY29fZ2FzLyBleHBvX2luZGVjX2dhcyAtIDEgKSAlPiUNCiAgbXV0YXRlKGV4cG9fZ2FzID0gY2FzZV93aGVuKGFuaW8gPCAxOTk3IH4gZXhwb19nYXNfY29tdHJhZGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAxOTk2IH5leHBvX3Nlc2NvX2dhcyApKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBleHBvX2dhcywgZXZlcnl0aGluZyguKSkNCg0KZXhwb19xX2dhc19NTUJUVSA8LSBleHBvX3FfZ2FzICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzZWxlY3QoLWModW5pZGFkKSkgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfbTNNTUJUVV9xKHgqMTAwMCl9ICkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1NQlRVIikNCg0KI01lcmdlIHZhbG9yDQpleHBvX3VzZF9nYXMgPC0gZXhwb19zZXNjb191c2RfZ2FzICU+JQ0KICBsZWZ0X2pvaW4oY29tZXhfaGlkcm9jYXJidXJvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2dhc19tZWNvbiA9IGV4cG9fZ2FzX01NdXNkKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShleHBvX2dhc19tZWNvbiA9IGV4cG9fZ2FzX21lY29uICogMTAwMDAwMCkpICAlPiUgDQogIGxlZnRfam9pbihleHBvX2hpZHJvX3ZhbG9yX2luZGVjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fZ2FzX2luZGVjID0gZXhwb19pbmRlY19nYXMpKSAlPiUgDQogIGZ1bGxfam9pbihleHBvX2dhc19zaXRjICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19nYXNfY29tdHJhZGUgPSB0cmFkZV92YWx1ZV91c2QsIHVuaWRhZCApKSAlPiUgDQogICMgbXV0YXRlKGRpZiA9IGV4cG9fc2VzY29fZ2FzL2V4cG9fZ2FzX2luZGVjIC0xKSAlPiUgDQogIG11dGF0ZShleHBvX2dhcyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5NyB+IGV4cG9fZ2FzX2NvbXRyYWRlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID49IDE5OTcgfiBleHBvX3Nlc2NvX2dhcykpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhwb19nYXMsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgYXJyYW5nZShhbmlvKQ0KICANCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoIGNhbnRpZGFkZXMgPSBleHBvX3FfZ2FzLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0QgPSBleHBvX3VzZF9nYXMsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHBvX3lfcmVmZXJlbmNpYSA9IHByZWNpb19leHBvX3lfbWVfZ2FzKSwNCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvZXhwb19nYXMueGxzeCIpDQoNCiMgY29tZXhfY3J1ZG9fc2VzY28gJT4lIGZpbHRlcih1bmlkYWQgPT0gIm0zIiwgdmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIikNCiMgY29tZXhfZ2FzICU+JSBmaWx0ZXIodW5pZGFkID09ICJtMyIsIHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIpDQpleHBvX3FfZ2FzIA0KZXhwb191c2RfZ2FzDQpgYGANCg0KIyMgRW1wbGVvLCBSZW11bmVyYWNpb25lcyB5IE1hc2EgU2FsYXJpYWwgKENDTk4pDQoNCiogU2FsYXJpbyB5IGVtcGxlbw0KICArIE1URXlTUyAoQmFzZSBNaW5lcsOtYSBlIEhpZHJvY2FyYnVyb3MgZGUgbGFzIEN1ZW50YXMgTmFjaW9uYWxlcykgKDE5OTYtMjAxMykNCiAgKyBbTWluaXN0ZXJpbyBkZSBUcmFiYWpvLCBFbXBsZW8geSBTZWd1cmlkYWQgU29jaWFsIC0gT2JzZXJ2YXRvcmlvIGRlIEVtcGxlbyB5IERpbsOhbWljYSBFbXByZXNhcmlhbCAoT0VERSldKGh0dHA6Ly93d3cudHJhYmFqby5nb2IuYXIvZXN0YWRpc3RpY2FzL29lZGUvZXN0YWRpc3RpY2FzbmFjaW9uYWxlcy5hc3ApICgxOTk2LTIwMTkpDQogICsgRVBIID8/DQo8YnI+DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojYW51YXJpb3MgQ0VQQUwNCmNlcGFsXzE5OTEgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9DRVBBTC9jZXBhbF8xOTkxLnhsc3giKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yIC8gY29udmVyc29yX3Blc29zJEEgLzEwXjMsDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIpDQoNCm1hc2Ffc2FsYXJpYWxfY2VwYWwgPC0gY2VwYWxfMTk5MSAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSA9PSAicmVtdW5lcmFjaW9uX2FsX3RyYWJham8iKSAlPiUgDQogIHJlbmFtZShtc19jZXBhbCA9IHZhbG9yKQ0KICANCg0KI2NvbiBkYXRvcyBkZSBsYSBiYXNlIGRlIENDTk4NCmVtcGxlbyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lY29uL2Jhc2UtbWluZXJpYS1lLWhpZHJvY2FyYnVyb3MgY3VlbnRhcyBuYWNpb25hbGVzLnhscyIsIA0KICAgIHNoZWV0ID0gIkVtcGxlbyByZWdpc3RyYWRvIiwgc2tpcCA9IDUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcOxbyIsDQogICAgICAgICAgcGVyaW9kbyA9IlBlcsOtb2RvIiwNCiAgICAgICAgIGVtcGxlb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgPSAiLi4uNyIsDQogICAgICAgIGVtcGxlb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyA9ICIuLi44IiApICU+JQ0KICAgZmlsdGVyKGlzLm5hKHBlcmlvZG8pLCAhaXMubmEoYW5pbykgKSAlPiUNCiAgc2VsZWN0KGFuaW8sIGVtcGxlb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MsZW1wbGVvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zICkgJT4lIA0KICBtdXRhdGUodW5pZGFkX2VtcGxlbyA9ICJQdWVzdG9zIGRlIHRyYWJham8iLA0KICAgICAgICAgZW1wbGVvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyA9IGFzLmRvdWJsZShlbXBsZW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKSwNCiAgICAgICAgIGVtcGxlb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyA9IGFzLmRvdWJsZShlbXBsZW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MpKSANCiAgDQoNCnNhbGFyaW9zIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVjb24vYmFzZS1taW5lcmlhLWUtaGlkcm9jYXJidXJvcyBjdWVudGFzIG5hY2lvbmFsZXMueGxzIiwgDQogICAgc2hlZXQgPSAiUmVtdW5lcmFjaW9uZXMiLCBjb2xfdHlwZXMgPSBjKCJudW1lcmljIiwgDQogICAgICAgICJkYXRlIiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAidGV4dCIpLCBza2lwID0gNSkgJT4lIA0KICAgIHJlbmFtZShhbmlvID0gIkHDsW8iLA0KICAgICAgICAgIHBlcmlvZG8gPSJQZXLDrW9kbyIsDQogICAgICAgICAgc2FsYXJpb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgPSAiLi4uNyIsDQogICAgICAgICBzYWxhcmlvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zID0gICIuLi44IikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGFuaW8pICYgYW5pbyA8IDIwMTQpICU+JSANCiAgc2VsZWN0KGFuaW8sIHNhbGFyaW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLHNhbGFyaW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfc2FsYXJpbyA9ICJQZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIHNhbGFyaW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zPSBhcy5kb3VibGUoc2FsYXJpb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MpLA0KICAgICAgICBzYWxhcmlvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zID0gYXMuZG91YmxlKHNhbGFyaW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MpKQ0KICAgDQptYXNhX3NhbGFyaWFsX2Njbm4gPC0gZW1wbGVvICU+JSANCiAgbGVmdF9qb2luKHNhbGFyaW9zLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUodW5pZGFkX21hc2Ffc2FsYXJpYWwgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBtYXNhX3NhbGFyaWFsX2V4dHJhY2Npb24gPSAoc2FsYXJpb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgKmVtcGxlb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MqMTMpLzEwXjYsDQogICAgICAgICBtYXNhX3NhbGFyaWFsX3NlcnZpY2lvcyA9IChzYWxhcmlvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zICplbXBsZW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MqMTMpLzEwXjYsDQogICAgICAgICBtYXNhX3NhbGFyaWFsX3RvdGFsID0gbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uICsgbWFzYV9zYWxhcmlhbF9zZXJ2aWNpb3MpIA0KDQoNCg0KI2NvbiBkYXRvcyBkZSBlbXBsZW8gcmVnaXN0cmFkbyANCnJlbXVuZXJhY2lvbmVzX2FudWFsIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWluaXN0ZXJpbyBUcmFiYWpvL25hY2lvbmFsX3NlcmllX3JlbXVuZXJhY2lvbmVzX2FudWFsLnhsc3giLCANCiAgICBzaGVldCA9ICJDIDUiLCBjb2xfdHlwZXMgPSBjKCJza2lwIiwgDQogICAgICAgICJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIpLCBza2lwID0gNCkgJT4lIA0KICBnYXRoZXIoa2V5ID0gYW5pbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAyOm5jb2woLikpICU+JQ0KICByZW5hbWUocmFtYV9hY3RpdmlkYWQgPSAiUmFtYSBkZSBhY3RpdmlkYWQiKSAlPiUgDQogIGZpbHRlciggc3RyX2RldGVjdChyYW1hX2FjdGl2aWRhZCwgInBldHLDs2xlbyIpKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfc2FsYXJpbyA9ICJQZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIHJhbWFfYWN0aXZpZGFkPSANCiAgICAgICAgICAgY2FzZV93aGVuKHJhbWFfYWN0aXZpZGFkPT0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aXZpZGFkZXMgIGRlIHNlcnZpY2lvcyByZWxhY2lvbmFkYXMgY29uIGxhIGV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyB5IGdhcywgZXhjZXB0byBsYXMgYWN0aXZpZGFkZXMgZGUgcHJvc3BlY2Npw7NuIiB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW11bmVyYWNpb25fc2VydmljaW9zX2V4dHJhY2Npb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1hX2FjdGl2aWRhZD09DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbyB5IGdhcyBuYXR1cmFsIiB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW11bmVyYWNpb25fZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiKSkgJT4lIA0KICAgIGZpbHRlcighKGlzLm5hKHJhbWFfYWN0aXZpZGFkKSkpICU+JSANCiAgc3ByZWFkKGtleSA9IHJhbWFfYWN0aXZpZGFkLA0KICAgICAgICAgdmFsdWUgPSB2YWxvcikNCiAgDQoNCg0KZW1wbGVvX2FudWFsIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWluaXN0ZXJpbyBUcmFiYWpvL25hY2lvbmFsX3NlcmllX2VtcGxlb19hbnVhbC54bHN4IiwgDQogICAgc2hlZXQgPSAiQyA1IiwgY29sX3R5cGVzID0gYygic2tpcCIsIA0KICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiKSwgDQogICAgc2tpcCA9IDQpJT4lIA0KICBnYXRoZXIoa2V5ID0gYW5pbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAyOm5jb2woLikpICU+JQ0KICByZW5hbWUocmFtYV9hY3RpdmlkYWQgPSAiUmFtYSBkZSBhY3RpdmlkYWQiKSAlPiUgDQogIGZpbHRlciggc3RyX2RldGVjdChyYW1hX2FjdGl2aWRhZCwgInBldHLDs2xlbyIpKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IGFzLmRvdWJsZSh2YWxvciksDQogICAgICAgICB1bmlkYWRfZW1wbGVvID0gIlB1ZXN0b3MgZGUgdHJhYmFqbyIsDQogICAgICAgICByYW1hX2FjdGl2aWRhZD0gY2FzZV93aGVuKHJhbWFfYWN0aXZpZGFkPT0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aXZpZGFkZXMgIGRlIHNlcnZpY2lvcyByZWxhY2lvbmFkYXMgY29uIGxhIGV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyB5IGdhcywgZXhjZXB0byBsYXMgYWN0aXZpZGFkZXMgZGUgcHJvc3BlY2Npw7NuIiB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbXBsZW9fc2VydmljaW9zX2V4dHJhY2Npb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1hX2FjdGl2aWRhZD09DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbyB5IGdhcyBuYXR1cmFsIiB+ICJlbXBsZW9fZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiKSkgJT4lIA0KICBmaWx0ZXIoIShpcy5uYShyYW1hX2FjdGl2aWRhZCkpKSAlPiUgDQogIHNwcmVhZChrZXkgPSByYW1hX2FjdGl2aWRhZCwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IpDQoNCm1hc2Ffc2FsYXJpYWxfb2VkZSA8LSBlbXBsZW9fYW51YWwgJT4lIA0KICBsZWZ0X2pvaW4ocmVtdW5lcmFjaW9uZXNfYW51YWwsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfbWFzYV9zYWxhcmlhbCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiA9ICggIHJlbXVuZXJhY2lvbl9leHRyYWNjaW9uX3BldHJvbGVvX2dhcyAqZW1wbGVvX2V4dHJhY2Npb25fcGV0cm9sZW9fZ2FzKjEzKS8xMF42LA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF9zZXJ2aWNpb3MgPSAocmVtdW5lcmFjaW9uX3NlcnZpY2lvc19leHRyYWNjaW9uICplbXBsZW9fc2VydmljaW9zX2V4dHJhY2Npb24qMTMpLzEwXjYsDQogICAgICAgICBtYXNhX3NhbGFyaWFsX3RvdGFsID0gbWFzYV9zYWxhcmlhbF9zZXJ2aWNpb3MgKyBtYXNhX3NhbGFyaWFsX2V4dHJhY2Npb24sDQogICAgICAgICBhbmlvID1hcy5kb3VibGUoYW5pbykpDQoNCm1hc2Ffc2FsYXJpYWxfaGlkcm9jYXJidXJvcyA8LSBtYXNhX3NhbGFyaWFsX2Njbm4gJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX21hc2Ffc2FsYXJpYWwsIG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbl9jY25uPSBtYXNhX3NhbGFyaWFsX2V4dHJhY2Npb24sIA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF90b3RhbF9jY25uID0gbWFzYV9zYWxhcmlhbF90b3RhbCkgJT4lIA0KICBmdWxsX2pvaW4obWFzYV9zYWxhcmlhbF9vZWRlICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9tYXNhX3NhbGFyaWFsLCANCiAgICAgICAgICAgICAgICAgICAgIG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbl9vZWRlPSBtYXNhX3NhbGFyaWFsX2V4dHJhY2Npb24sDQogICAgICAgICAgICAgICAgICAgICBtYXNhX3NhbGFyaWFsX3RvdGFsX29lZGUgPW1hc2Ffc2FsYXJpYWxfdG90YWwpKSAlPiUgDQogIGZ1bGxfam9pbihtYXNhX3NhbGFyaWFsX2NlcGFsICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgbXNfY2VwYWwpKSAlPiUgDQogICMgbXV0YXRlKG1zID0gY2FzZV93aGVuKGFuaW8gPCAxOTk2IH4gbXNfY2VwYWwsDQogICMgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk5NiB+bWFzYV9zYWxhcmlhbF9vZWRlKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQptYXNhX3NhbGFyaWFsX2hpZHJvY2FyYnVyb3MgIA0KDQoNCmBgYA0KDQoNCg0KIyMgUG96b3MNCg0KDQojIyMgTWV0cm9zIHBlcmZvcmFkb3MNCg0KRnVlbnRlOg0KDQoqIFtTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYV0oaHR0cHM6Ly9kYXRvcy5nb2IuYXIvZGF0YXNldC9lbmVyZ2lhLXBlcmZvcmFjaW9uLXBvem9zLXBldHJvbGVvLWdhcykNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbWV0cm9zX3BlcmZvcmFkb3NfcG9zdGVyaW9yX2FsXzIwMDkgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3Mvc2VjcmV0YXJpYSBkZSBlbmVyZ2lhL21ldHJvcy1wZXJmb3JhZG9zLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoaW5kaWNlX3RpZW1wbyA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlWS0lbSIpKSkNCg0KbWV0cm9zX3BlcmZvcmFkb3NfYW50ZXJpb3JfYWxfMjAwOSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9zZWNyZXRhcmlhIGRlIGVuZXJnaWEvbWV0cm9zLXBlcmZvcmFkb3MtYW50ZXJpb3ItYWwtMjAwOS5jc3YiKSAlPiUgDQogIHJlbmFtZShjYW50aWRhZCA9IENhbnRpZGFkKQ0KDQptZXRyb3NfcGVyZm9yYWRvc19lbXByZXNhIDwtIG1ldHJvc19wZXJmb3JhZG9zX3Bvc3Rlcmlvcl9hbF8yMDA5ICU+JQ0KICBiaW5kX3Jvd3MobWV0cm9zX3BlcmZvcmFkb3NfYW50ZXJpb3JfYWxfMjAwOSkgJT4lIA0KICBzZWxlY3QoYW5pbywgbWVzLCBpZGVtcHJlc2EsIGVtcHJlc2EsIGlkY29uY2VwdG8sIGNvbmNlcHRvLCBjYW50aWRhZCwgb2JzZXJ2YWNpb25lcyApICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgaWRlbXByZXNhLCBlbXByZXNhKSAlPiUNCiAgc3VtbWFyaXNlKG1ldHJvc19wZXJmb3JhZG9zID0gc3VtKGNhbnRpZGFkLCBuYS5ybSA9IFQpKSAlPiUgDQogIHVuZ3JvdXAoKQ0KICANCg0KbWV0cm9zX3BlcmZvcmFkb3MgPC0gbWV0cm9zX3BlcmZvcmFkb3NfZW1wcmVzYSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UobWV0cm9zX3BlcmZvcmFkb3MgPSBzdW0obWV0cm9zX3BlcmZvcmFkb3MsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUoaW5kaWNlX21ldHJvcyA9IGdlbmVyYXJfaW5kaWNlKHNlcmllPSBtZXRyb3NfcGVyZm9yYWRvcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9iYXNlID0gMjAwMSkpIA0KDQpncmFmX21ldHJvc19wZXJmb3JhZG9zIDwtIG1ldHJvc19wZXJmb3JhZG9zX2VtcHJlc2ElPiUgDQogIGdncGxvdChhZXMoYW5pbywgbWV0cm9zX3BlcmZvcmFkb3MsIGZpbGwgPSBlbXByZXNhKSkgKw0KICBnZW9tX2NvbCgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSsNCiAgbGFicyh0aXRsZSA9ICJNZXRyb3MgcGVyZm9yYWRvcyBwb3IgZW1wcmVzYSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkNCmdncGxvdGx5KGdyYWZfbWV0cm9zX3BlcmZvcmFkb3MsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQoNCg0KI2xpc3RhZG8gZGUgZW1wcmVzYXMgY29uIHN1cyBpZCdzDQpsaXN0YWRvX2VtcHJlc2EgPC0gZGlzdGluY3QobWV0cm9zX3BlcmZvcmFkb3NfZW1wcmVzYSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChpZGVtcHJlc2EsIGVtcHJlc2EpLGlkZW1wcmVzYSwgLmtlZXBfYWxsID0gVCkgDQogIA0KDQoNCmBgYA0KDQoNCg0KIyMjIFBvem9zIGVuIG9wZXJhY2nDs24NCg0KRnVlbnRlczoNCg0KKiBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAtIFtEYXRvcyBNSU5FTV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdG9zbWluZW0vcHJvZHVjY2lvbi1kZS1wZXRyb2xlby15LWdhcy1wb3ItcG96byk6DQogICsgW0xpc3RhZG8gZGUgcG96b3MgY2FyZ2Fkb3MgcG9yIGVtcHJlc2FzIG9wZXJhZG9yYXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9wcm9kdWNjaW9uLWRlLXBldHJvbGVvLXktZ2FzLXBvci1wb3pvL2FyY2hpdm8vY2JmYTRkNzktZmZiMy00MDk2LWJhYjUtZWIwZGRlOWE4Mzg1KTogc2UgdG9tYSBsYSB2YXJpYWJsZSAiRmVjaGEgZGVsIEZpbiBkZSB0ZXJtaW5hY2nDs24gZGUgcGVyZm9yYWNpw7NuIGRlbCBwb3pvIiAoYWRqaXZfZmVjaGFfZmluX3Rlcm0pIGNvbW8gYcOxbyBkZSBwdWVzdGEgZW4gcHJvZHVjY2nDs24gZGVsIHBvem8uIFNlIHBvZHLDrWEgZWxhYm9yYXIgdW4gc3RvY2sgZGUgcG96b3MgYSBwYXJ0aXIgZGUgYWN1bXVsYXIgbG9zIHBvem9zIHRlcm1pbmFkb3MgeSByZXN0YW5kbyBsb3MgcG96b3MgYWJhbmRvbmFkb3MsIGFncnVwYW5kbyBjb24gbGEgdmFyaWFibGUgIkZlY2hhIGRlIGFiYW5kb25vIGRlbCBwb3pvIihhZGppdl9mZWNoYV9hYmFuZG9ubykNCiAgKyBbUG96b3MgdGVybWluYWRvc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3BlcmZvcmFjaW9uLWRlLXBvem9zLWRlLXBldHJvbGVvLXktZ2FzL2FyY2hpdm8vYTJjZTE0YWYtNWM1Ni00NWMyLTliOWMtYzdhMWU1MTU2ZGZmKQ0KICArIFtDYXDDrXR1bG8gSVZdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9wcm9kdWNjaW9uLWRlLXBldHJvbGVvLXktZ2FzLXBvci1wb3pvL2FyY2hpdm8vY2I1YzBmMDQtNzgzNS00NWNkLWI5ODItM2UyNWNhN2Q3NzUxKQ0KICArIFtFc3RhZG8gZGUgcG96b3NdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9lc3RhZG8tZGUtcG96b3MtZGUtcGV0cm9sZW8teS1nYXMpIChBVU4gTk8gU0UgUFJPQ0VTw5MgRVNUQSBCQVNFIE5JIExBIEFOVEVSSU9SKSANCiAgKyBbU0VTQ09dKGh0dHA6Ly93d3cuZW5lcmdpYS5nb2IuYXIvY29udGVuaWRvcy92ZXJwYWdpbmEucGhwP2lkcGFnaW5hPTE2MjQpDQoqIFtJQVBHXShodHRwczovL3d3dy5pYXBnLm9yZy5hci93ZWJfaWFwZy9zZWN0b3Jlcy9lc3RhZGlzdGljYXMvcHJvZHVjdG9zL2xpc3RhZG9zL2xpc3RhZG9fdG9kb3NfbG9zX3Byb2R1Y3Rvcy5odG0pLiBTZSBwcmVzZW50YW4gZG9zIHNlcmllczogdW5hIGVsYWJvcmFkYSBhIHBhcnRpciBkZSBsb3MgcG96b3MgcGVyZm9yYWRvcyBwb3IgYcOxbyAocmVzdWx0YW50ZSBkZSBkZXNjYXJnYXIgdW5hIGJhc2UgcG9yIGNhZGEgYcOxbyBkZWwgc2l0aW8gd2ViIG9maWNpYWwpIHkgb3RyYSBxdWUgY29ycmVzcG9uZGUgYWwgc3RvY2sgZGUgcG96b3MgZGUgcGV0csOzbGVvIGRlIGV4dHJhY2Npw7NuIGVmZWN0aXZhIChwcm9jZWRlbnRlIGRlIGxvcyBkYXRvcyBkZSBFc3RhZMOtc3RpY2FzIGRlbCBDZW50ZW5hcmlvIGRlIElBUEcpLg0KDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgbWVjaG89RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0KIyBzZWMgZW5lcmdpYQ0KIyBwb3pvcyBjYXJnYWRvcyBwb3IgZW1wcmVzYXMNCmxpc3RhZG9fcG96b3MgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvY2FwaXR1bG8gaXYvbGlzdGFkby1kZS1wb3pvcy1jYXJnYWRvcy1wb3ItZW1wcmVzYXMtb3BlcmFkb3Jhcy5jc3YiKSAlPiUgDQogIG11dGF0ZShhbmlvX3Rlcm1pbmFjaW9uX3Bvem8gPXllYXIoYWRqaXZfZmVjaGFfZmluX3Rlcm0pKSAlPiUNCiAgbGVmdF9qb2luKGxpc3RhZG9fZW1wcmVzYSkgJT4lIA0KICBncm91cF9ieShhbmlvX3Rlcm1pbmFjaW9uX3Bvem8sIGlkZW1wcmVzYSwgZW1wcmVzYSkgJT4lIA0KICBzdW1tYXJpc2UocG96b3MgPSBuKCkpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvX3Rlcm1pbmFjaW9uX3Bvem8pKQ0KDQoNCiAgIyBtdXRhdGUoZW1wcmVzYSA9IGNhc2Vfd2hlbihpZGVtcHJlc2EgPT0gIllQRiIgfiAiWVBGIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiUEFFIiB+ICJQQUUiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJZU1VSIiB+ICJZU1VSIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiUExVIiB+ICJQbHVzcGV0cm9sIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiUExVRSIgfiAiUGx1c3BldHJvbCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlZJUyIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJUUFQiIH4gIlRlY3BldHJvbCIsIA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJDR0MiIH4gIkNHQyIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIldJTiIgfiAiV2ludGVyc2hhbGwiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJUQVUiIH4gIlRvdGFsIEF1c3RyYWwiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJZU1VSIiB+ICJZU1VSIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiU0hFIiB+ICJTaGVsbCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIkNBUCIgfiAiQ2FwZXgiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJQUEFNIiB+ICJQYW1wYSIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gIk90cmEiKSkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZGVtcHJlc2EgPT0gIlBFVFJPQlJBUyBBUkdFTlRJTkEgUy5BLiIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiUEVTQSAoUEVUUk9CUkFTIEUuUy5BLikiIH4gIlBldHJvYnJhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZGVtcHJlc2EgPT0gIkVOQVAgU0lQRVRST0wgQVJHRU5USU5BIFMuQS4iIH4gIkVOQVAgU0lQRVRST0wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWRlbXByZXNhID09ICJWSVNUQSBPSUwgJiBHQVMgQVJHRU5USU5BIFNBIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZGVtcHJlc2EgPT0gIlNJTk9QRUMgQVJHRU5USU5BIEVYUExPUkFUSU9OIEFORCBQUk9EVUNUSU9OLCBJTkMuIiB+ICJTaW5vcGVjIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiUExVU1BFVFJPTCBFTkVSR1kgUy5BLiIgfiAiUGx1c3BldHJvbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZGVtcHJlc2EgPT0gIllTVVIgUEVUUk9MRVJBIEFSR0VOVElOQSBTLkEuIiB+ICJZU1VSIikpDQoNCmdyYWZfcG96b3Nfc2VjX2VuZXJnaWEgPC0gbGlzdGFkb19wb3pvcyAlPiUgDQogIGdncGxvdChhZXMoYW5pb190ZXJtaW5hY2lvbl9wb3pvLCBwb3pvcywgZmlsbCA9IGVtcHJlc2EpKSsNCiAgZ2VvbV9jb2woKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGxhYnModGl0bGUgPSAiUG96b3MgY2FyZ2Fkb3MgcG9yIGVtcHJlc2FzIG9wZXJhZG9yYXMgKHBvciBhw7FvIGRlIHRlcm1pbmFjacOzbikiLA0KICAgICAgIGNhcHRpb24gPSAiU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEiKQ0KZ2dwbG90bHkoZ3JhZl9wb3pvc19zZWNfZW5lcmdpYSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQogIA0KcG96b3NfdGVybWluYWRvc19hbnRlcmlvcl9hbF8yMDA5IDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL3NlY3JldGFyaWEgZGUgZW5lcmdpYS9wb3pvcy10ZXJtaW5hZG9zLWFudGVyaW9yLWFsLTIwMDkuY3N2IikgJT4lIA0KICByZW5hbWUoY2FudGlkYWQgPSBDYW50aWRhZCkNCg0KcG96b3NfdGVybWluYWRvcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9zZWNyZXRhcmlhIGRlIGVuZXJnaWEvcG96b3MtdGVybWluYWRvcy5jc3YiKSAlPiUgDQogIGJpbmRfcm93cyhwb3pvc190ZXJtaW5hZG9zX2FudGVyaW9yX2FsXzIwMDkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgaWRlbXByZXNhLCBlbXByZXNhICkgJT4lIA0KICBzdW1tYXJpc2UocG96b3MgID0gc3VtKGNhbnRpZGFkLCBuYS5ybSA9IFQpKQ0KDQoNCmdyYWZfcG96b3NfdGVybWluYWRvcyA8LSBwb3pvc190ZXJtaW5hZG9zICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8sIHBvem9zICwgZmlsbCA9IGVtcHJlc2EpKSsNCiAgZ2VvbV9jb2woKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGxhYnModGl0bGUgPSAiQ2FudGlkYWQgZGUgcG96b3MgdGVybWluYWRvcyIsDQogICAgICAgY2FwdGlvbiA9ICJTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSIpDQpnZ3Bsb3RseShncmFmX3Bvem9zX3Rlcm1pbmFkb3MsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI3Bvem9zIGlhcGcgKGJhc2VzIGFudWFsZXMpDQpwb3pvX2lhcGdfMDUgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDA1LnhscyIsIA0KICAgIHNraXAgPSAxKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAwNSkgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzA2IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAwNi54bHMiLCANCiAgICBza2lwID0gMSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMDYpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18wNyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMDcueGxzIiwgDQogICAgc2tpcCA9IDEpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDA3KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMDggPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDA4LnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAwOCkgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzA5IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAwOS54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMDkpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18xMCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTAueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDEwKSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMTIgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDEyLnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxMikgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzEzIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxMy54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTMpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18xNCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTQueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDE0KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMTUgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDE1LnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxNSkgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzE2IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxNi54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTYpDQoNCnBvem9faWFwZ18xNyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTcueGxzIiwgDQogICAgc2tpcCA9IDIpICAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxNykNCg0KcG96b19pYXBnXzE4IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxOC54bHMiLCANCiAgICBza2lwID0gMikgICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDE4KQ0KDQpwb3pvX2lhcGdfMTkgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDE5LnhscyIsIA0KICAgIHNraXAgPSAyKSAgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTkpICU+JSANCiAgcmVuYW1lKCJUb3RhbCBQb3pvcyIgPSAiVG90YWwgUG96b3MgVGVybWluYWRvcyIpDQoNCiNzZSBtZSBjb2xhcm9uIGFsZ3VuYXMgZmlsYXMgZGUgdG90YWxlcyBxdWUgaGF5IHF1ZSBib3JyYXINCnBvem9zX2lhcGcgPC0gcG96b19pYXBnXzA1ICU+JSANCiAgYmluZF9yb3dzKHBvem9faWFwZ18wNiwgcG96b19pYXBnXzA3LCBwb3pvX2lhcGdfMDgsIHBvem9faWFwZ18wOSwgDQogICAgICAgICAgICBwb3pvX2lhcGdfMTAsIHBvem9faWFwZ18xMiwgcG96b19pYXBnXzEzLCBwb3pvX2lhcGdfMTQsIHBvem9faWFwZ18xNSwNCiAgICAgICAgICAgIHBvem9faWFwZ18xNiwgcG96b19pYXBnXzE3LCBwb3pvX2lhcGdfMTgsIHBvem9faWFwZ18xOSkgJT4lDQogIHJlbmFtZSh0b3RhbF9wb3pvcyA9ICAiVG90YWwgUG96b3MiKSAlPiUgDQogIGZpbHRlcighKE9wZXJhZG9yICVpbiUgYygiVG90YWxlcyIsICJUT1RBTCIpKSAmICEoaXMubmEoT3BlcmFkb3IpKSApICU+JSANCiAgbXV0YXRlKGVtcHJlc2EgPWNhc2Vfd2hlbihPcGVyYWRvciA9PSAiWVBGIFMuQS4iIH4gIllQRiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgKFNVQ1VSU0FMIEFSR0VOVElOQSkgTExDIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJQQU4gQU1FUklDQU4gRU5FUkdZIFNMIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJQQU4gQU1FUklDQU4iIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlBFVFJPQlJBUyBBUkdFTlRJTkEgUy5BLiIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiUEVTQSAoUEVUUk9CUkFTIEUuUy5BLikiIH4gIlBldHJvYnJhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlRFQ1BFVFJPTCBTLkEuIiB+ICJUZWNwZXRyb2wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJQTFVTUEVUUk9MIFMuQS4iIH4gIlBsdXNwZXRyb2wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJTSU5PUEVDIEFSR0VOVElOQSBFWFBMT1JBVElPTiBJTkMiIH4gIlNpbm9wZWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJDT01QQcORw41BIEdFTkVSQUwgREUgQ09NQlVTVElCTEVTIFMuQS4iIH4gIkNHQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0EiIH4gIlZpc3RhIE9pbCBhbmQgR2FzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQVUiIH4gIlZpc3RhIE9pbCBhbmQgR2FzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiV0lOVEVSU0hBTEwgRU5FUkdJQSBTLkEuIiB+ICJXaW50ZXJzaGFsbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIkVOQVAgU0lQRVRST0wgQVJHRU5USU5BIFMuQS4iIH4gIkVOQVAgU0lQRVRST0wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJZU1VSIEVORVJHw41BIEFSR0VOVElOQSBTLlIuTC4iIH4gIllTVVIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJZU1VSIFBFVFJPTEVSQSBBUkdFTlRJTkEgUy5BIiB+ICJZU1VSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiVE9UQUwgQVVTVFJBTCBTLkEuIiB+ICJUb3RhbCBBdXN0cmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gT3BlcmFkb3IpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShlbXByZXNhKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoZW1wcmVzYSwgYW5pbyx0b3RhbF9wb3pvcykgJT4lIA0KICBncm91cF9ieShhbmlvLCBlbXByZXNhKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9wb3pvcyA9IHN1bSh0b3RhbF9wb3pvcykpICU+JSANCiAgYXJyYW5nZShhbmlvKQ0KcG96b3NfaWFwZw0KDQpncmFmX3Bvem9zX2lhcGcgPC0gcG96b3NfaWFwZyAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdG90YWxfcG96b3MsIGZpbGwgPSBlbXByZXNhKSkrDQogIGdlb21fY29sKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIlBvem9zIHBlcmZvcmFkb3MiLA0KICAgICAgIGNhcHRpb24gPSAiSUFQRyIpDQpnZ3Bsb3RseShncmFmX3Bvem9zX2lhcGcsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojcG96b3MgaWFwZyBhY3VtdWxhZG9zDQpwb3pvc19pYXBnX2NlbnRlbmFyaW8gPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL3Bvem9zX2lhcGdfY2VudGVuYXJpby5jc3YiLCAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHRvdGFsZXMgPSB0b3RhbGUpDQoNCmdyYWZfcG96b3NfaWFwZ19jZW50ZW5hcmlvIDwtIHBvem9zX2lhcGdfY2VudGVuYXJpbyAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdG90YWxlcykpKw0KICBnZW9tX2NvbCgpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgbGFicyh0aXRsZSA9ICJQb3pvcyBlbiBleHRyYWNjacOzbiBkZWZpbml0aXZhIiwNCiAgICAgICBjYXB0aW9uID0gIklBUEciKQ0KZ2dwbG90bHkoZ3JhZl9wb3pvc19pYXBnX2NlbnRlbmFyaW8sIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCg0KIyBjb21wYXJhY2lvbiBkZSBmdWVudGVzDQpjb21wYXJhY2lvbl9wb3pvcyA8LSBwb3pvc19pYXBnICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UocG96b3NfcGVyZm9yYWRvc19pYXBnID0gc3VtKHRvdGFsX3Bvem9zLCBuYS5ybSA9IFQpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocG96b3NfdGVybWluYWRvcyAlPiUNCiAgICAgICAgICAgICAgIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgICAgICAgICAgICAgIHN1bW1hcmlzZShwb3pvc190ZXJtaW5hZG9zX3NlY19lbmVyZ2lhID0gc3VtKHBvem9zLCBuYS5ybSA9IFQpKSkgJT4lIA0KICByaWdodF9qb2luKGxpc3RhZG9fcG96b3MgJT4lIA0KICAgICAgICAgICAgICAgIHJlbmFtZShhbmlvID0gYW5pb190ZXJtaW5hY2lvbl9wb3pvKSAlPiUgDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZShwb3pvc19jYXJnYWRvc19zZWNfZW5lcmdpYSA9IHN1bShwb3pvcywgbmEucm0gPSBUKSkpICU+JSANCiAgZnVsbF9qb2luKHBvem9zX2lhcGdfY2VudGVuYXJpbyAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZSh2YXJpYWNpb25fcG96b3MgPSB2YXJpYWNpb25faW50ZXJhbnVhbCh0b3RhbGVzKSkgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwb3pvc192YXJpYWNpb25faWFwZyA9IHZhcmlhY2lvbl9wb3pvcykpIA0KDQoNCmdyYWZfcG96b3MgPC0gY29tcGFyYWNpb25fcG96b3MgJT4lDQogIGdhdGhlcihrZXkgPSAiZnVlbnRlIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGZ1ZW50ZSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgIyBnZW9tX3BvaW50KCkrDQogIHlsaW0oMCwgMTcwMCApKw0KICBsYWJzKHRpdGxlID0gIlBvem9zLiBDb21wYXJhY2nDs24gZGUgZnVlbnRlcyIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCmdncGxvdGx5KGdyYWZfcG96b3MsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KDQp2ZXIgcmVsYWNpb25lcw0KKiBQQkkgaGlkcm9jYXJidXJvcyAvIFBCSSB0b3RhbCAodmVyIGN1YWwgZWxlZ2lyKQ0KKiBjb3JyZWdpciBudWVzdHJvIFZCUCBkZXB1cmFuZG8gc2VydmljaW9zDQoqIE1JUCdzIGNvZWYgdGVjbmljbyAocGFyYSB2ZXIgQ0kgZW4gZWwgc2VjdG9yIHBldHJvbGVybyB5IHBlc28gZGVsIHNlY3RvciBwZXRyb2xlcm8gZW4gUEJJKQ0KDQoqIHN0b2NrIHBldHJvbGVybyAvIHN0b2NrIHRvdGFsIEpJQyxFTSANCiogU3RvY2sgZXh0cmFjY2lvbiA9IFBQeUUgUEFFICsgUFB5RSBUZWNwICsgUFB5RSBQZXRyb2JyYXMgdXBzdHIgKyBBY3Rpdm8gWVBGIHVwc3RyZWFtDQogICogdmVyIHF1ZSBwb3JjZW50YWplIHF1ZSByZXByZXNlbnRhbiBlc3RhcyBlbXByZXNhcyBlbiBsYSBwcm9kdWNjaW9uIG8gcG96b3MgeSB2ZXIgZGUgYW1wbGlhcmxvIA0KICAqIHZlciByZWxhY2lvbiBBY3Rpdm8gWVBGIHVwc3RyZWFtIC8gUFB5RSBpbnRlZ3JhZGEgWVBGDQogICogdmVyIHJlbGFjaW9uIGdhbmFuY2lhcyBBRklQIHkgQk9MU0FSIGNvbiBlbCBzdG9jayBjb3JyZXNwb25kaWVudGUgKGNvaGVyZW5jaWEpIA0KICAqIHZlciByZWxhY2lvbiBjb24gQ29yZW1iZXJnDQogICogcGFzYXIgRU5HRSANCg0KKmdyaW5iZXJnDQogICogY29udmVydGlyIGxvIG51ZXN0cm8gYSBjb3N0b3MuIGFnYXJyYXIgbnVlc3Ryb3MgdmFsb3IgeSBkaXZpZGlybG8gcG9yIGJhcnJpbGVzIChzdW1hbmRvIGdhcyBlbiBCT0UpDQogICogY29zdG9zIHBvciBiYmwsIHByZWNpbyBlbCBiYXJyaWwgeSBwcmVjaW8gZGUgcHJvZHVjY2lvbiAoc3VtbyBsYSBnY2lhIG5vcm1hbCBhbCBjb3N0bzEpDQoNCg0KIyMgQWN0aXZvcw0KDQpQYXNhciBkYXRvcyBkZSBicyBkZSB1c28gZW4geWFjaW1pZW50b3MgcGFyYSBhcm1hciByZWxhY2nDs24gYWN0aXZvIHlhY2ltZWludG8vdG90YWwNCg0KRnVlbnRlczoNCg0KKiBCYWxhbmNlcyBkZSBCb2xzYXIgKHVuaWNhbWVudGUgZW1wcmVzYXMgcXVlIGNvdGl6YW4gZW4gbGEgYm9sc2EgZGUgdmFsb3JlcyBhcmdlbnRpbmEpLiBSZXZpc2FyIGVsIHN0b2NrIGRlbCBzZWN0b3IgZGlzdHJpYnVjacOzbiBwb3JxdWUgc2UgcHJlc2VudGEgZGVtYXNpYWRvIGdyYW5kZSBjb24gcmVzcGVjdG8gYWwgZGUgbG9zIGRlbcOhcy4gRmFsdGEgcGFzYXIgbG9zIGRhdG9zIGRlbCBhY3Rpdm8gZGUgY2FzaSB0b2RhcyBsYXMgZW1wcmVzYXMNCiogQUZJUC4gQ29uIGVzdGEgZnVlbnRlIG5vIHRlbmVtb3MgY2FsY3VsbyBkZSByZW50YSwgc2lubyBxdWUgc29sbyB1c2Ftb3MgbGEgVEcgY29tbyBwYXLDoW1ldHJvLiBOb3RhOiAiX2MiIHNpZ25pZmljYSBjYXNvcyBwcmVzZW50YWRvcyBkZSBsYSB2YXJpYWJsZSBjb3JyZXNwb25kaWVudGUNCiogTWVtb3JpYXMgZGUgWVBGLiBMYSBkw6ljYWRhIGRlIGxvcyA4MCBwcmVzZW50YSBwaWNvcyBxdWUgaGF5IHF1ZSByZXZpc2FyDQoNCg0KKiBDYWxjdWxvIGRlbCBDYXBpdGFsIFRvdGFsIEFkZWxhbnRhZG8gKEtUQSkgDQoNCiAgKyBCb2xzYXI6IEVzIGVxdWl2YWxlbnRlIGEgbGEgc3VtYSBkZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwb3MgTmV0YSAoZGVzY29udGFuZG8gbG9zIHRlcnJlbm9zIHkgb2JyYXMgZW4gY3Vyc28pIHkgbG9zIEludmVudGFyaW9zLiBDdWFuZG8gbG9zIGRhdG9zIGxvIGhhYmlsaXRhbiwgc2UgbGUgYWdyZWfDsyBsb3Mgc2FsYXJpb3MgYWRlbGFudGFkb3MgKHNhbGFyaW9zIHkgY2FyZ2FzIGNvbnN1bWlkb3Mgc29icmUgcm90YWNpw7NuKS4gTHVlZ28sIGN1YW5kbyBubyBzZSBwcmVzZW50YXJvbiBkYXRvcyBkZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwb3MsIHNlIHRvbcOzIGVsIGFjdGl2byBubyBjb3JyaWVudGUuDQogICsgQUZJUDogRXMgZXF1aXZhbGVudGUgYSBsYSBzdW1hIGRlIEJpZW5lcyBkZSBVc28sIEJpZW5lcyBkZSBDYW1iaW8sIEludmVudGFyaW9zIHkgRGlzcG9uaWJpbGlkYWRlcy4NCiAgKyBNZW1vcmlhIFlQRjogU3VtYSBkZSBCaWVuZXMgZGUgVXNvIHkgQmllbmVzIGRlIENhbWJpbw0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgQk9MU0FSDQoNCiNzZWdtZW50b3MgZGUgWVBGIHkgUGV0cm9icmFzDQp5cGZfc2VnIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IveXBmX3NlZ21lbnRvcy5jc3YiLCANCiAgICAiLCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JSANCiAgc2VsZWN0KC1YMSkgJT4lIA0KICBtdXRhdGUoc2VjdG9yID0gY2FzZV93aGVuKCBzZWN0b3IgPT0gICJxdWltaWNhIiB+ICJwZXRyb3F1aW1pY2EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gc2VjdG9yKSwNCiAgICAgICAgIGFuaW8gPSB5ZWFyKGZlY2hhKSkNCg0KcGV0cm9icmFzX2FyX3NlZyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3BldHJvYnJhc19hcmdfc2VnbWVudG9zLmNzdiIsIA0KICAgICIsIiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSklPiUgDQogIHNlbGVjdCgtWDEpDQoNCnVuaW9uX3NlZ21lbnRvcyA8LSB5cGZfc2VnICU+JSANCiAgc2VsZWN0KGFuaW8sIGVtcHJlc2Esc2VjdG9yLCB1bmlkYWQsIGFjdGl2byA9IGFjdGl2b3MpICU+JSANCiAgYmluZF9yb3dzKHBldHJvYnJhc19hcl9zZWcgJT4lIA0KICAgICAgICAgICAgICByZW5hbWUoYW5pbyA9IGZlY2hhKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvICwgZW1wcmVzYSwgdW5pZGFkLCBzZWN0b3IsIHByb3BfcGxhbnRhX2VxdWlwbyA9IHBweWUsIGFjdGl2byA9IGFjdGl2b3MpKSAlPiUgDQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICA1Om5jb2woLikpICU+JQ0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPXZhbG9yL2lwY18xOCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IikgJT4lIA0KICBzZWxlY3QoLWlwY18xOCkNCg0Kc3RvY2tfc2VnbWVudG9zIDwtIHVuaW9uX3NlZ21lbnRvcyAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHNlY3RvciwgdmFyaWFibGUgLHVuaWRhZCApICU+JSANCiAgc3VtbWFyaXNlKHZhbG9yID0gc3VtKHZhbG9yLCBuYS5ybSA9IFQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShmdWVudGUgPSAiQWN0aXZvIGRlIFlQRiB5IFBldHJvYnJhcyIsDQogICAgICAgICB2YXJpYWJsZV9zZWN0b3IgPSBwYXN0ZSh2YXJpYWJsZSwgc2VjdG9yLCBzZXAgPSAiICIpKQ0KDQoNCiMjIFN0b2NrIHBvciBlbXByZXNhcw0Kc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy9iYWxhbmNlc19hcmcuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUgDQogIGZpbHRlciggIShlbXByZXNhICVpbiUgYygiY2hldnJvbl9nbG9iYWwiLCAicGV0cm9icmFzX2dsb2JhbCIgKSkpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IiwNCiAgICAgICAgIGFuaW8gPSB5ZWFyKGZlY2hhKSwNCiAgICAgICAgIGZ1ZW50ZSA9ICJCb2xzYXIiKSAlPiUNCiAgc2VsZWN0KGFuaW8sZnVlbnRlLCBldmVyeXRoaW5nKC4pLCAtYyhmZWNoYSwgcGFpcywgdGdfYW50LCB0Z19kZXNwLCByb3RhY2lvbikpICU+JSANCiAgIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICA2Om5jb2woLikpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgL2lwY18xOCwNCiAgICAgICAgIGVtcHJlc2EgPSBjYXNlX3doZW4oZW1wcmVzYSA9PSAicGV0cm9icmFzX2FyIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJ0ZWNwZXRyb2wiIH4gIlRlY3BldHJvbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gImNhbXV6emlfcGFtcCIgfiAiQ2FtdXp6aSBHYXMgUGFtcGVhbmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJtZXRyb2dhcyIgfiAiTWV0cm9nYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZW1wcmVzYSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgZW1wcmVzYSxmdWVudGUsIHNlY3RvciwgdW5pZGFkLCB2YXJpYWJsZSkgJT4lDQogIHN1bW1hcmlzZSh2YWxvciA9IHN1bSh2YWxvciwgbmEucm0gPSBUKSkgJT4lDQogIGZpbHRlcih2YXJpYWJsZSAlaW4lIGMoIktUQSIsICJwcHllIiwgInBweWVfbmV0YSIgLCAiaW52ZW50YXJpb3MiLCAiYWN0aXZvX25vX2NvcnIiLCAiYWN0aXZvIikpDQogICAgDQoNCg0KIyMgU3RvY2sgcG9yIHJhbWENCnN0b2NrX2JhbGFuY2VzX3JhbWEgPC0gIHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBiaW5kX3Jvd3Moc3RvY2tfc2VnbWVudG9zICU+JSANCiAgICAgICAgICAgICAgIyBmaWx0ZXIoc2VjdG9yID09ICJ1cHN0cmVhbSIgJiB2YXJpYWJsZSA9PSAiYWN0aXZvIikgJT4lDQogICAgICAgICAgICAgIGZpbHRlcih2YXJpYWJsZV9zZWN0b3IgPT0gImFjdGl2byB1cHN0cmVhbSIpICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoLXZhcmlhYmxlX3NlY3RvcikgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShzZWN0b3IgPSBjYXNlX3doZW4oc2VjdG9yID09ICJ1cHN0cmVhbSIgfiAicHJvZHVjY2lvbiIpLA0KICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgPSAgY2FzZV93aGVuKHZhcmlhYmxlID09ICJhY3Rpdm8iIH4gInBweWUiKSwNCiAgICAgICAgICAgICAgICAgICAgIGZ1ZW50ZSA9ICJCb2xzYXIiLA0KICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9IllQRiB5IFBldHJvYnJhcyIpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHNlY3Rvcix2YXJpYWJsZSwgdW5pZGFkLCBmdWVudGUpICU+JQ0KICBzdW1tYXJpc2UodmFsb3IgPSBzdW0odmFsb3IsIG5hLnJtID0gVCkpICANCiAgDQogICMgc3ByZWFkKGtleSA9IHNlY3RvciwNCiAgIyAgICAgICAgdmFsdWUgPSBLVEEpICU+JSANCiAgIyBtdXRhdGUoaW50ZWdyYWRhX3lfZXh0cmFjY2lvbiA9IGludGVncmFkYSArIHByb2R1Y2Npb24sDQogICMgICAgICAgIHZhcmlhYmxlID0gIktUQSIpICU+JSANCiAgIyByZW5hbWUoZXh0cmFjY2lvbiA9IHByb2R1Y2Npb24pICU+JSANCiAgIyBzZWxlY3QoYW5pbywgdmFyaWFibGUsIG1vbmVkYSwgZXZlcnl0aGluZyguKSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgVGFzYXMgZGUgZGVwcmVjaWFjaW9uDQojQUZJUA0KdGFzYV9kZXByZWNpYWNpb25fYWZpcCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9BRklQL2djaWFfdjgueGxzeCIsIA0KICAgIHNraXAgPSA0KSAlPiUNCiAgc2VsZWN0KC1jKDQ5Om5jb2woLikpKSAlPiUgDQogIGdyb3VwX2J5KCByYW1hLCB5ZWFyKSAlPiUgDQogIHN1bW1hcmlzZSh0YXNhX2RlcHJlY2lhY2lvbiA9IGRlcHJlY2lhY2lvbmJzdXNvL2JzdXNvKQ0KI0JhbGFuY2VzDQpyZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICAgICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lDQogICAgZmlsdGVyKGVtcHJlc2EgPT0gIllQRiIpICU+JSANCiAgICBncm91cF9ieShlbXByZXNhKSAlPiUgDQogICAgbXV0YXRlKHRhc2FfZGVwcmVjaWFjaW9uID0gZGVwcmVjaWFjaW9uZXMvcHB5ZSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGVtcHJlc2EsIHRhc2FfZGVwcmVjaWFjaW9uKQ0KDQoNCiMjI0FGSVANCiMgU3RvY2sgZGUgYmFsYW5jZXMgLSAgQUZJUA0KZGF0b3NfYWZpcCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9BRklQL2djaWFfdjgueGxzeCIsIA0KICAgIHNraXAgPSA0KSAlPiUNCiAgc2VsZWN0KC1jKDQ5Om5jb2woLikpKSAgJT4lIA0KICByZW5hbWUoYW5pbyA9IHllYXIsDQogICAgICAgICBpZHNlY3RvciA9IGlkcmFtYSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgc2VjdG9yID0gY2FzZV93aGVuKCByYW1hID09ICJwZXRybyIgfiAiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtYSA9PSAic2VyX3BldHJvIiB+ICJzZXJ2aWNpb3NfcGV0cm9sZXJvcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmFtYSkpJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBpZHNlY3Rvciwgc2VjdG9yLCBldmVyeXRoaW5nKC4pLCAtcmFtYSkNCmRhdG9zX2FmaXANCg0KDQpzdG9ja19hZmlwIDwtIGRhdG9zX2FmaXAgJT4lIA0KICBncm91cF9ieShhbmlvLCBpZHNlY3Rvciwgc2VjdG9yLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKEtUQSA9IGRpc3BvbmliaWxpZGFkZXMgKyBic2NhbWJpbyArIGludmVudGFyaW9zICsgYnN1c28sDQogICAgICAgICAgICBwcHllID0gc3VtKGJzdXNvLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgYWN0aXZvID0gc3VtKGFjdGl2bywgbmEucm0gPSBUKSkgJT4lDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgbXV0YXRlKEtUQSA9IChLVEEvMTBeNikgLyBpcGNfMTgsDQogICAgICAgICBwcHllPSAocHB5ZS8xMF42KSAvIGlwY18xOCwNCiAgICAgICAgIGFjdGl2bz0gKGFjdGl2by8xMF42KSAvIGlwY18xOCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IikgJT4lIA0KICBhcnJhbmdlKGlkc2VjdG9yKSAlPiUgDQogIGZpbHRlcihzZWN0b3IgJWluJSBjKCJleHRyYWNjaW9uX3BldHJvbGVvX2dhcyIsICJzZXJ2aWNpb3NfcGV0cm9sZXJvcyIpKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KC1jKGlkc2VjdG9yLCBpcGNfMTgpKSAlPiUgDQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICA0Om5jb2woLikpICU+JSANCiAgbXV0YXRlKGZ1ZW50ZSA9ICJBRklQIikNCnN0b2NrX2FmaXANCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgDQojIE1lbW9yaWFzIFlQRiANCmJhbGFuY2VfeXBmIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXhjZWxzIGRlIEJldGFuaWEvQ2FsY3Vsb3MgQmV0YW5pYSBUZy54bHMiLCANCiAgICBzaGVldCA9ICJZUEZfQSAkSE9ZX1BBUkFERUZMQUNZQ0FMQ1VMQVIiLCANCiAgICBza2lwID0gMSkgJT4lIA0KICBzZWxlY3QoLWMoMTI6bmNvbCguKSkpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcOxbyIsDQogICAgICAgICB1bmlkYWQgPSBtb25lZGEsDQogICAgICAgICB2ZW50YXMgPSAiVmVudGFzLi4uMyIsDQogICAgICAgICBjb3N0b192ZW50YXMgPSAiQ29zdG8gZGUgbGFzIFZlbnRhcy4uLjQiLA0KICAgICAgICAgdXRpbGlkYWRfbmV0YSA9ICJVdGlsaWRhZCBuZXRhIiwNCiAgICAgICAgIHV0aWxpZGFkX29wZXJhdGl2YSA9ICJVdGlsaWRhZCBvcGVyYXRpdmEiLA0KICAgICAgICAgcHB5ZSA9ICJCcyBVc28iLA0KICAgICAgICAgYmllbmVzX2RlX2NhbWJpbyA9ICJCcyBDYW1iaW8iLA0KICAgICAgICAgdXRpbGlkYWRfbmV0YV9hbnRlc19pbXB1ZXN0b3MgPSAiVU4gYW50ZXMgZGUgaW1wdWVzdG9zIChnwrQgYWN0aXZvcyB5IGRpdmlkZW5kb3MpIiwNCiAgICAgICAgIGFjdGl2byA9ICJBY3Rpdm8gVG90YWwiLA0KICAgICAgICAgcGF0cmltb25pb19uZXRvID0gIlBhdHJpbW9uaW8gTmV0byIpICU+JQ0KICBmaWx0ZXIoIShpcy5uYShhbmlvKSkpICU+JQ0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JQ0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHt4IC8gMTBeNn0pICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgIGRlIDIwMTgiLA0KICAgICAgICAgdmVudGFzID12ZW50YXMvaXBjXzE4LA0KICAgICAgICAgY29zdG9fdmVudGFzID0gY29zdG9fdmVudGFzL2lwY18xOCwNCiAgICAgICAgIHV0aWxpZGFkX25ldGEgPSB1dGlsaWRhZF9uZXRhL2lwY18xOCwNCiAgICAgICAgIHV0aWxpZGFkX29wZXJhdGl2YSA9IHV0aWxpZGFkX29wZXJhdGl2YS9pcGNfMTgsDQogICAgICAgICBwcHllID0gcHB5ZS9pcGNfMTgsDQogICAgICAgICBiaWVuZXNfZGVfY2FtYmlvID0gYmllbmVzX2RlX2NhbWJpby9pcGNfMTgsDQogICAgICAgICB1dGlsaWRhZF9uZXRhX2FudGVzX2ltcHVlc3RvcyA9IHV0aWxpZGFkX25ldGFfYW50ZXNfaW1wdWVzdG9zL2lwY18xOCwNCiAgICAgICAgIGFjdGl2byA9IGFjdGl2by9pcGNfMTgsDQogICAgICAgICBwYXRyaW1vbmlvX25ldG8gPSBwYXRyaW1vbmlvX25ldG8vaXBjXzE4LA0KICAgICAgICAgS1RBID0gcHB5ZSArIGJpZW5lc19kZV9jYW1iaW8sDQogICAgICAgICBzZWN0b3IgPSAiTWVtb3JpYSBkZSBZUEYiKSAlPiUgDQogIHNlbGVjdChhbmlvLCBzZWN0b3IsIHVuaWRhZCwgZXZlcnl0aGluZyguKSkgDQpiYWxhbmNlX3lwZg0KDQpzdG9ja195cGYgPC0gYmFsYW5jZV95cGYgJT4lIA0KICBnYXRoZXIoa2V5ID0gdmFyaWFibGUsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLCANCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgJWluJSBjKCJLVEEiLCAiYWN0aXZvIiwgInBweWUiKSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSBjYXNlX3doZW4oYW5pbyA9PSAxOTgzIH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPT0gMTk4NSB+IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5ODYgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTg3IH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPT0gMTk4OCB+IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdmFsb3IpKSAlPiUNCiAgYmluZF9yb3dzKHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JSANCiAgICB1bmdyb3VwKCkgJT4lIA0KICAgIHNlbGVjdChhbmlvLCAgc2VjdG9yID1lbXByZXNhLCB1bmlkYWQsIHZhcmlhYmxlLCB2YWxvciApICU+JSANCiAgICBmaWx0ZXIoc2VjdG9yID09ICJZUEYiLA0KICAgICAgICAgICB2YXJpYWJsZSAgJWluJSBjKCJLVEEiLCAiYWN0aXZvIiwgInBweWUiKSkpDQogIA0KDQpgYGANCg0KIyMjIFN0b2NrIHRvdGFsIGRlIGxhIHJhbWEgDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBTdG9jayBkZSBsYSByYW1hDQpzdG9ja19yYW1hIDwtIHN0b2NrX2FmaXAgJT4lIA0KICBiaW5kX3Jvd3Moc3RvY2tfYmFsYW5jZXNfcmFtYSkNCg0KIyB3cml0ZS5jc3Yoc3RvY2tfcmFtYSwgZmlsZSA9Ii9BcmNoaXZvcy9EYXRvcy9TdG9jay9zdG9ja19oaWRyb2NhcmJ1cm9zLmNzdiIpDQoNCg0KZ3JhZl9zdG9ja19yYW1hIDwtIHN0b2NrX3JhbWEgJT4lIA0KICAjIG11dGF0ZSh2YWxvciA9IG51bWJlcl9mb3JtYXQodmFsb3IsIGJpZy5tYXJrID0gIiAiICkpICU+JSANCiAgZmlsdGVyKHNlY3RvciAhPSAiZGlzdHJpYnVjaW9uIikgJT4lDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gc2VjdG9yLCBzaGFwZSA9IGZ1ZW50ZSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludChzaXplID0gLjgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiU3RvY2sgZGUgY2FwaXRhbCBhZGVsYW50YWRvIHkgYWN0aXZvIGRlIHNlZ21lbnRvcyIsDQogICAgICAgc3VidGl0bGUgPSAiU3Vic2VjdG9yZXMgZGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybyIsDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgZmFjZXRfd3JhcCh+IHZhcmlhYmxlICkNCg0KZ2dwbG90bHkoZ3JhZl9zdG9ja19yYW1hLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCg0KIyMjIFN0b2NrIGRlIHNlZ21lbnRvcyBkZSBZUEYgeSBQZXRyb2JyYXMNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpncmFmX3N0b2NrX3NlZ21lbnRvcyA8LSB1bmlvbl9zZWdtZW50b3MgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHNlY3RvcikpKw0KICBnZW9tX2xpbmUoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlN0b2NrIGRlIGNhcGl0YWwgZGUgc2VnbWVudG9zIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJZUEYgeSBQZXRyb2JyYXMgQXJnZW50aW5hIiwNCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICBmYWNldF93cmFwKHZhcmlhYmxlIH4gZW1wcmVzYSApDQoNCmdncGxvdGx5KGdyYWZfc3RvY2tfc2VnbWVudG9zLCB3aWR0aCA9IDcwMCwgaGVpZ2h0ID0gNTAwKQ0KDQoNCmBgYA0KDQojIyMgU3RvY2sgcG9yIGVtcHJlc2FzDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmdyYWZfc3RvY2tfZW1wIDwtIHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JQ0KICBmaWx0ZXIoDQogICAgIyB2YXJpYWJsZSAlaW4lIGMoIktUQSIsICJhY3Rpdm8iKSwNCiAgICAgICAgIHNlY3RvciAhPSAiZGlzdHJpYnVjaW9uIikgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGVtcHJlc2EpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiU3RvY2sgZGUgY2FwaXRhbCBwb3IgZW1wcmVzYSIsDQogICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICBmYWNldF93cmFwKH52YXJpYWJsZSkNCmdncGxvdGx5KGdyYWZfc3RvY2tfZW1wLCB3aWR0aCA9IDcwMCwgaGVpZ2h0ID0gNTAwKQ0KDQoNCmBgYA0KDQojIyMgWVBGIGxhcmdvIHBsYXpvDQpDb21wYXJhY2nDs24gZW50cmUgbGEgTWVtb3JpYSBZUEYgKHJlY29waWxhZG8gcG9yIEJGUikgeSBsb3MgYmFsYW5jZXMgZXh0csOtYWRvcyBkZSBCb2xzYXINCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmdyYWZfc3RvY2tfeXBmIDwtICBzdG9ja195cGYgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHNlY3RvcikpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJTdG9jayBkZSBjYXBpdGFsIGRlIFlQRiIsDQogICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICBmYWNldF93cmFwKH52YXJpYWJsZSkNCmdncGxvdGx5KGdyYWZfc3RvY2tfeXBmLCB3aWR0aCA9IDcwMCwgaGVpZ2h0ID0gNTAwKQ0KDQpgYGANCg0KIyMjIEVzdGltYWNpw7NuIGRlIHN0b2NrIGRlIGNhcGl0YWwgYSBwYXJ0aXIgZGUgbGEgZXZvbHVjacOzbiBkZSBwb3pvcyBwZXJmb3JhZG9zDQoNCg0KRWwgZWplcmNpY2lvIGNvbnNpc3RlIGVuIHZlcmlmaWNhciBzaSBsb3MgcG96b3MgdGVybWluYWRvcyBzaXJ2ZW4gY29tbyBpbmRpY2Fkb3IgZGUgbGEgaW52ZXJzacOzbiB5LCBwb3IgbG8gdGFudG8sIGRlIGFwcm94aW1hZG9yIGFsIHN0b2NrIGRlIGNhcGl0YWwgYWRlbGFudGFkby4gUGFyYSBlbGxvIHNlIHBhcnRlIGRlIHVuIGHDsW8gYmFzZSBkZSBsYSBzZXJpZSBkZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyBkZWwgc2VjdG9yIGV4dHJhY2Npw7NuIGRlIEJvbHNhciB5IEFGSVAsIHBhcmEgbHVlZ28gaW5kZXhhciBsYXMgdmFyaWFibGVzIHBvciBsYSBldm9sdWNpw7NuIGRlIGxvcyBwb3pvcy4gTG9zIGJhbGFuY2VzIGRlIEJvbHNhciBxdWUgY29ycmVzcG9uZGVuIMO6bmljYW1lbnRlIGEgZXh0cmFjY2nDs24gc29uIGRvczogUEFFIHkgVGVjcGV0cm9sLCBwb3IgbG8gcXVlIGVsIHZhbG9yIG9idGVuaWRvIHB1ZWRlIGVzdGFyIHN1YnJlcHJlc2VudGFkbyBwYXJhIGRhciBjdWVudGEgZGVsIHRvdGFsIGRlIGxhIHJhbWEuIENvbiByZXNwZWN0byBhbCDDrW5kaWNlIGRlIHBvem9zLCBzZSB0b21hcm9uIGRvcyBzZXJpZXMgYWx0ZXJuYXRpdmFzOiB1bmEgY29uc3RydcOtZGEgYSBwYXJ0aXIgZGVsIHN0b2NrIGRlIHBvem9zIGVuIGV4dHJhY2Npw7NuIGVmZWN0aXZhIChmdWVudGU6IElBUEcpIHkgb3RyYSBlbGFib3JhZGEgY29uIGxvcyBwb3pvcyB0ZXJtaW5hZG9zIGFudWFsZXMgY2FyZ2Fkb3MgcG9yIGVtcHJlc2Egb3BlcmFkb3JhIChmdWVudGU6IFNlY3JldGFyw61hIGRlIEVuZXJnw61hKS4gIA0KDQpFbCBhw7FvIGJhc2UgZWxlZ2lkbyBlcyAyMDA2LCBkYWRvIHF1ZSBlcyBlbCDDumx0aW1vIGRhdG8gcXVlIHBvc2VlbW9zIGRlbCBzdG9jayBkZSBwb3pvcyB0b3RhbGVzIGVuIGFjdGl2aWRhZCBkZSBJQVBHLg0KDQpTZSByZWFsaXrDsyBsYSBtaXNtYSBlc3RpbWFjacOzbiBwYXJhIFlQRiwgZmlsdHJhbmRvIGxhcyB2YXJpYWJsZXMgZGUgUHJvcGllZGFkLCBQbGFudGEgeSBFcXVpcG8gKHBhcmEgZWwgdG90YWwgZGUgbGEgZW1wcmVzYSwgcG9yIGxvIHF1ZSBpbmNsdXllIG5vIHPDs2xvIGV4dHJhY2Npw7NuIHNpbm8gcmVmaW5hY2nDs24geSBvdHJvcyBydWJyb3MpIHkgYWN0aXZvIHRvdGFsIGRlbCB1cHN0cmVhbS4gU2UgdXRpbGl6w7Mgw7puaWNhbWVudGUgZWwgaW5kaWNlIGRlIHBvem9zIHRlcm1pbmFkb3MgYW51YWxlcyBkZSBZUEYgcGFyYSBlc3RpbWFyIGxhIFBQeUUgeSBlbCAgYWN0aXZvLCBkYWRvIHF1ZSBubyBzZSBwb3NlZSB2YWxvcmVzIGRlbCBzdG9jayBkZSBwb3pvcyBlbiBwZXJmb3JhY2nDs24gcGFyYSBsb3MgYcOxb3MgZW4gZG9uZGUgZXhpc3RlbiB2YWxvcmVzIGNvbnRhYmxlcyBxdWUgc2lydmFuIGRlIGHDsW8gYmFzZS4gTHVlZ28sIHNlIGVzdGltw7MgdW4gc3RvY2sgZGUgY2FwaXRhbCB0b3RhbCBkZSByYW1hIGEgcGFydGlyIGRlIHBvbmRlcmFyIGVsIHN0b2NrIGRlIFlQRiBwb3IgbGEgcmVsYWNpw7NuIGVudHJlIGxvcyBwb3pvcyBkZSBZUEYgeSBsb3MgcG96b3MgdG90YWxlcyBkZSBsYSByYW1hLg0KDQoNCkVuIHPDrW50ZXNpcywgZWwgbGlzdGFkbyBkZSB2YXJpYWJsZXMgZXN0aW1hZGFzLSBhIHBhcnRpciBkZSBsYXMgZG9zIHNlcmllcyBkZSBwb3pvcyAoc3RvY2sgeSBmbHVqbyksc2Fsdm8gcGFyYSBsYSBlc3RpbWFjacOzbiBkZSBZUEYgcXVlIHNvbG8gc2UgcHVkbyBoYWNlciBjb24gZmx1am8gZGUgcG96b3MgcG9yIGF1c2VuY2lhIGRlIGluZm9ybWFjacOzbi0gZXMgbGFzIHNpZ3VpZW50ZXM6DQoNCiogJHBweWVcX2VzdGltYWRvXF9ib2xzYXIkID0gJFBQeUVcIGHDsW9cIGJhc2VcIGRlXCBCb2xzYXIkICogJGluZGljZVwgZGVcIHBvem9zJA0KKiAkcHB5ZVxfZXN0aW1hZG9cX2FmaXAkID0gJFBQeUVcIGHDsW9cIGJhc2VcIGRlXCBBRklQJCAqICRpbmRpY2VcIGRlXCBwb3pvcyQNCg0KKiAkcHB5ZVxfZXN0aW1hZG9cX3lwZiQgPSAkUFB5RVwgYcOxb1wgYmFzZVwgZGVcIFlQRiQgKiAkaW5kaWNlXCBkZVwgcG96b3NcIFlQRiQNCiogJGFjdGl2b1xfZXN0aW1hZG9cX3Vwc3RyZWFtXF95cGYkID0gJEFjdGl2b1wgYcOxb1wgYmFzZVwgZGVcIFlQRiQgKiAkaW5kaWNlXCBkZVwgcG96b3NcIFlQRiQNCg0KKiAkcHB5ZVxfZXN0aW1hZG9cX3RvdGFsJCA9ICRwcHllXF9lc3RpbWFkb1xfeXBmJCAqICQkXGZyYWN7cG96b3NcIHRvdGFsZXN9e3Bvem9zXCBkZVwgWVBGfSQkDQoNCiogJGFjdGl2b1xfZXN0aW1hZG9cX3Vwc3RyZWFtJCA9ICRhY3Rpdm9cX2VzdGltYWRvXF91cHN0cmVhbVxfeXBmJCAgKiAkJFxmcmFje3Bvem9zXCB0b3RhbGVzfXtwb3pvc1wgZGVcIFlQRn0kJA0KDQpQYXJhIHBvZGVyIHNlbGVjY2lvbmFyIGxhIGVzdGltYWNpw7NuIG3DoXMgYWRlY3VhZGEsIHNlIHJlYWxpesOzIHVuIGFuw6FsaXNpcyBkZSBjb3JyZWxhY2nDs24gZW50cmUgdG9kYXMgbGFzIHNlcmllcyBlc3RpbWFkYXMgeSBsb3MgdmFsb3JlcyBjb250YWJsZXMgcXVlIHNlIHBvc2VlbiBkZSBQUHlFIGRlIEFGSVAsIEJvbHNhciBlIFlQRi4gU2UgcHJlc2VudGFuIGRpc3RpbnRvcyBjdWFkcm9zIGRlIGNvcnJlbGFjaW9uZXMsIGNvbiBzdXMgbml2bGVzIGRlIHNpZ25pZmljYW5jaWEsIGRpYWdyYW1hcyBkZSBkaXNwZXJzacOzbiBlbnRyZSB2YXJpYWJsZXMgeSBzdSBkaXN0cmlidWNpw7NuLiBMYXMgc2VyaWVzIGNvbnN0cnXDrWRhcyBxdWUgcG9zZWVuIG1lam9yIGNvcnJlbGFjacOzbiBzb24gbGEgUHJvcGllZGFkLCBQbGFudGEgeSBFcXVpcG8gYSBwYXJ0aXIgZGUgQm9sc2FyIGVzdGltYWRhcyBjb24gw61uZGljZSBkZSBzdG9jayBkZSBwb3pvcyAoY29ycmVsYWNpw7NuIGZ1ZXJ0ZSBkZSAwLjg5IHkgc2lnbmlmaWNhdGl2YSBhbCAwLjAwMSkgeSBmbHVqbyBkZSBwb3pvcyAoY29ycmVsYWNpw7NuIG1vZGVyYWRhIGRlIDAuNTQgeSBzaWduaWZpY2F0aXZhIGFsIDAuMDUpIHkgbHVlZ28gZWwgYWN0aXZvIGRlbCB1cHN0cmVhbSB0b3RhbCBkZSBsYSByYW1hIGEgcGFydGlyIGRlIFlQRiAoY29ycmVsYWNpw7NuIG1vZGVyYWRhIGRlIDAuNDIgeSBzaWduaWZpY2F0aXZhIGFsIDAuMSBjb24gbG9zIHZhbG9yZXMgY29udGFibGVzIGRlIFlQRiB5IGNvcnJlbGFjacOzbiBmdWVydGUgZGUgMC44OCB5IHNpZ25pZmljYXRpdmEgYWwgMC4wMDEgY29uIGxhcyBlc3RpbWFjaW9uZXMgZGUgUFB5RSBkZSBBRklQIHkgQm9sc2FyIGEgcGFydGlyIGRlIGZsdWpvIGRlIHBvem9zKS4NCg0KbGEgZXN0aW1hY2nDs24gdGllbmUgcXVlIHJlYWxpemFyc2UgY29uIFBQeUUgcG9ycXVlIGhheSBxdWUgZXhjbHVpciBzYWxhcmlvcyBlIGludmVudGFyaW9zIChxdWUgZXN0w6FuIGVuIEtUQSkNCg0KIyMjIyBBbsOhbGlzaXMgZGUgY29ycmVsYWNpb24gZW50cmUgUHJvcGllZGFkLCBQbGFudGEgeSBFcXVpcG8geSBQb3pvcyBlbiBwcm9kdWNjacOzbg0KDQoNCnJlZW1wbGF6YXIgaXBjIHBvciB1biBpYmlmIG8gaW5kaWNlIGVzcGVjaWZpY28NCg0KIyMjIyMgVG90YWwgcmFtYQ0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0Kc3RvY2tfeV9wb3pvc190YXNhcyA8LSBzdG9ja19yYW1hICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIiAmIHNlY3RvciAlaW4lIGMoImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIiwgInByb2R1Y2Npb24iKSkgJT4lDQogIHNlbGVjdChhbmlvLCB2YWxvcixmdWVudGUpICU+JQ0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgc3ByZWFkKGtleSA9IGZ1ZW50ZSwgdmFsdWUgPSB2YWxvcikgJT4lIA0KICBtdXRhdGUoQUZJUCA9IHZhcmlhY2lvbl9pbnRlcmFudWFsKEFGSVApLA0KICAgICAgICAgQm9sc2FyID0gdmFyaWFjaW9uX2ludGVyYW51YWwoQm9sc2FyKSkgJT4lIA0KICBmdWxsX2pvaW4oY29tcGFyYWNpb25fcG96b3MgDQogICAgICAgICAgICAlPiUNCiAgICAgICAgICAgICMgc2VsZWN0KC0gcG96b3NfcGVyZm9yYWRvc19pYXBnKQ0KICAgICAgICAgICAgc2VsZWN0KC0gcG96b3NfdmFyaWFjaW9uX2lhcGcpDQogICAgICAgICAgICAsIGJ5ID0gImFuaW8iKSAlPiUNCiAgcmVuYW1lKHBweWVfYWZpcCA9IEFGSVAsDQogICAgICAgICBwcHllX2JvbHNhciA9IEJvbHNhciwNCiAgICAgICAgIHBvem9zX2lhcGcgPSBwb3pvc19wZXJmb3JhZG9zX2lhcGcsDQogICAgICAgICAjIHBvem9zX2lhcGdfY2VudGVuYXJpbyA9IHBvem9zX3ZhcmlhY2lvbl9pYXBnLA0KICAgICAgICAgcG96b3NfdGVybWluYWRvcyA9IHBvem9zX3Rlcm1pbmFkb3Nfc2VjX2VuZXJnaWEsDQogICAgICAgICBwb3pvc19jYXJnYWRvcyA9IHBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhICkgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JQ0KICBmaWx0ZXIoYW5pbyA+IDE5OTgpICU+JQ0KICBzZWxlY3QoLWFuaW8pICU+JQ0KICBtdXRhdGVfYWxsKHRhc2FfY3JlY2ltaWVudG8pICANCiAgDQoNCg0KR0dhbGx5OjpnZ3BhaXJzKHN0b2NrX3lfcG96b3NfdGFzYXMsIGxvd2VyID0gbGlzdChjb250aW51b3VzID0gInNtb290aCIpKQ0KcGxvdChzdG9ja195X3Bvem9zX3Rhc2FzKQ0KDQojIHJvdW5kKHZhcihzdG9ja195X3Bvem9zX3Rhc2FzLCBuYS5ybSA9IFRSVUUpLCA0KQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KI21hdHJpeiBkZSBjb3JyZWxhY2lvbg0KY29yX3Bvem9zIDwtIGNvcihzdG9ja195X3Bvem9zX3Rhc2FzLCB1c2UgPSAiY29tcGxldGUub2JzIikNCmNvcl9wb3pvcw0KDQojICBkaXN0aW50b3MgY29ycmVsb2dyYW1hcw0KI2NvbiBnZ2NvcnJwbG90DQpsaWJyYXJ5KGdnY29ycnBsb3QpDQpwLm1hdCA9IGNvcl9wbWF0KHN0b2NrX3lfcG96b3NfdGFzYXMpDQpnZ2NvcnJwbG90KGNvcl9wb3pvcywgaGMub3JkZXIgPSBUUlVFLA0KICAgIHR5cGUgPSAibG93ZXIiLCBwLm1hdCA9IHAubWF0LCBsYWIgPSBUKQ0KDQojICMgI2NvbiBjb3JycGxvdA0KIyBjb2wgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCIjQkI0NDQ0IiwgIiNFRTk5ODgiLCAiI0ZGRkZGRiIsICIjNzdBQUREIiwgIiM0NDc3QUEiKSkNCiMgY29ycnBsb3Q6OmNvcnJwbG90KGNvcl9wb3pvcywgbWV0aG9kPSJjb2xvciIsIGNvbD1jb2woMjAwKSwNCiMgICAgICAgICAgdHlwZT0idXBwZXIiLCBvcmRlcj0iaGNsdXN0IiwNCiMgICAgICAgICAgYWRkQ29lZi5jb2wgPSAiYmxhY2siLCAjIEFkZCBjb2VmZmljaWVudCBvZiBjb3JyZWxhdGlvbg0KIyAgICAgICAgICB0bC5jb2w9ImJsYWNrIiwgdGwuc3J0PTQ1LCAjVGV4dCBsYWJlbCBjb2xvciBhbmQgcm90YXRpb24NCiMgICAgICAgICAgIyBDb21iaW5lIHdpdGggc2lnbmlmaWNhbmNlDQojICAgICAgICAgICMgcC5tYXQgPSBwLm1hdCwNCiMgICAgICAgICAgIyBpbnNpZyA9ICJibGFuayIsDQojICAgICAgICAgIHNpZy5sZXZlbCA9IDAuMDEpDQoNCiMgIyAjY29uIGdnZ2FsbHkNCiMgR0dhbGx5OjpnZ2NvcnIoc3RvY2tfeV9wb3pvc190YXNhcywgbWV0aG9kID0gYygiY29tcGxldGUub2JzIiwgInBlYXJzb24iKSAsDQojICAgICAgICAgICAgICAgIGxhYmVsID0gVCwgbGFiZWxfcm91bmQgPSAyKQ0KYGBgDQoNCmBgYHtyfQ0KI2HDsW9zIGJhc2UgMjAwNg0KcHB5ZV9hbmlvX2Jhc2VfYm9sc2FyIDwtIChzdG9ja19yYW1hICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIiAmIHNlY3RvciA9PSAicHJvZHVjY2lvbiIpICU+JQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcHllID0gdmFsb3IpKQ0KcHB5ZV9hbmlvX2Jhc2VfYm9sc2FyIDwtIHBweWVfYW5pb19iYXNlX2JvbHNhciRwcHllW3BweWVfYW5pb19iYXNlX2JvbHNhciRhbmlvID09MjAwNl0NCg0KIyB2YWxvcl9iYXNlIDwtIHNlcmllW3doaWNoKGZlY2hhPT1mZWNoYV9iYXNlKV0NCg0KcHB5ZV9hbmlvX2Jhc2VfYWZpcCA8LSAoc3RvY2tfcmFtYSAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZSIgJiBzZWN0b3IgPT0gImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIikgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHBweWUgPSB2YWxvcikpDQpwcHllX2FuaW9fYmFzZV9hZmlwIDwtIHBweWVfYW5pb19iYXNlX2FmaXAkcHB5ZVtwcHllX2FuaW9fYmFzZV9hZmlwJGFuaW8gPT0gMjAwNl0NCg0KDQpzdG9ja195X3Bvem9zIDwtICBjb21wYXJhY2lvbl9wb3pvcyAlPiUgDQogIGdhdGhlcihrZXkgPSBmdWVudGVfcG96bywNCiAgICAgICAgIHZhbHVlID0gY2FudGlkYWRfcG96b3MsDQogICAgICAgICAyOm5jb2woLikpICU+JQ0KICBhcnJhbmdlKGZ1ZW50ZV9wb3pvLGFuaW8pICU+JSANCiAgZ3JvdXBfYnkoZnVlbnRlX3Bvem8pICU+JSANCiAgbXV0YXRlKGluZGljZV9wb3pvc18wNiA9IGdlbmVyYXJfaW5kaWNlKHNlcmllPSBjYW50aWRhZF9wb3pvcyAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDA2KSkgJT4lIA0KICAjIGxlZnRfam9pbihzdG9ja19yYW1hICU+JSAgDQogICMgICAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIiAmIHNlY3RvciAlaW4lIGMoImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIiwgInByb2R1Y2Npb24iKSkgJT4lDQogICMgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHBweWUgPSB2YWxvciwgZnVlbnRlX3N0b2NrID0gZnVlbnRlKSwgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHBweWVfYWZpcCA9IHBweWVfYW5pb19iYXNlX2FmaXAgKiBpbmRpY2VfcG96b3NfMDYsDQogICAgICAgICBwcHllX2JvbHNhciA9cHB5ZV9hbmlvX2Jhc2VfYm9sc2FyICogaW5kaWNlX3Bvem9zXzA2LA0KICAgICAgICAgdW5pZGFkX3BweWU9Ik1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSAlPiUgDQogIGdhdGhlcihrZXkgPSBmdWVudGVfcHB5ZSwNCiAgICAgICAgIHZhbHVlID0gcHB5ZV9lc3RpbWFkbywNCiAgICAgICAgIDU6NikNCnN0b2NrX3lfcG96b3MNCg0KZ2dwbG90bHkoc3RvY2tfeV9wb3pvcyAlPiUgDQogIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbyxwcHllX2VzdGltYWRvICwgY29sb3IgPSBmdWVudGVfcG96bykpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh5PSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICBmYWNldF93cmFwKH5mdWVudGVfcHB5ZSAgICApLA0KICAgIHdpZHRoID0gODAwLCBsZW5ndGggPTUwMCkNCg0KI3N0b2NrIGVzdGltYWRvIGEgcGFydGlyIGRlIHBvem9zDQpzdG9ja19lc3RpbWFkbyA8LSBzdG9ja195X3Bvem9zICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZmlsdGVyKGZ1ZW50ZV9wb3pvID09InBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhIiwgZnVlbnRlX3BweWUgPT0icHB5ZV9ib2xzYXIiKSAlPiUgDQogIHJlbmFtZSh1bmlkYWQgPSB1bmlkYWRfcHB5ZSwgdmFsb3IgPXBweWVfZXN0aW1hZG8pICU+JSANCiAgc2VsZWN0KC1jKGNhbnRpZGFkX3Bvem9zLCBpbmRpY2VfcG96b3NfMDYsIGZ1ZW50ZV9wb3pvKSkNCg0KDQojZGlmZXJlbmNpYSBlbnRyZSBwcHllIGVzdGltYWRhIHkgdmFsb3IgY29udGFibGUgZGUgYm9sc2FyDQpzdG9ja19lc3RpbWFkbyAlPiUgDQogIGxlZnRfam9pbihzdG9ja19yYW1hICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGZ1ZW50ZT09IkJvbHNhciIsIHZhcmlhYmxlID09InBweWUiLCBzZWN0b3IgPT0gInByb2R1Y2Npb24iKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIHBweWVfYm9sc2FyID0gdmFsb3IpKSAlPiUgDQogIG5hLm9taXQoKSAlPiUgDQogIG11dGF0ZShkaWZmID0gKHZhbG9yL3BweWVfYm9sc2FyIC0xKSoxMDApDQoNCiNjYW1iaW8gc3RvY2sgc29sbyBwYXJhIGxvcyBhw7FvcyBxdWUgdGVuZW1vcyBCT0xTQVINCnN0b2NrX2VzdGltYWRvIDwtIHN0b2NrX3JhbWEgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoZnVlbnRlICVpbiUgYygiQm9sc2FyIiwgIkFGSVAiKSwgdmFyaWFibGUgPT0icHB5ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgc2VjdG9yICVpbiUgYygicHJvZHVjY2lvbiIsICJleHRyYWNjaW9uX3BldHJvbGVvX2dhcyIpKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsZnVlbnRlX3BweWU9ZnVlbnRlICwgdmFsb3IpDQogIA0KICANCmBgYA0KDQoNCiMjIyMjIyBTdG9jayBkZSBwb3pvcw0KYGBge3J9DQpzdG9ja195X3Bvem9zX3Rhc2FzX3YyIDwtIHN0b2NrX3JhbWEgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgc2VjdG9yICVpbiUgYygiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiLCAicHJvZHVjY2lvbiIpKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHZhbG9yLGZ1ZW50ZSkgJT4lDQogIHNwcmVhZChrZXkgPSBmdWVudGUsIHZhbHVlID0gdmFsb3IpICU+JSANCiAgZnVsbF9qb2luKHBvem9zX2lhcGdfY2VudGVuYXJpbyU+JQ0KICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHBvem9zX2lhcGcgPSB0b3RhbGVzICksIGJ5ID0gImFuaW8iKSAlPiUNCiAgcmVuYW1lKHBweWVfYWZpcCA9IEFGSVAsDQogICAgICAgICBwcHllX2JvbHNhciA9IEJvbHNhciApICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUNCiAgZmlsdGVyKGFuaW8gPiAxOTk4KSAlPiUNCiAgc2VsZWN0KC1hbmlvKSAlPiUNCiAgbXV0YXRlX2FsbCh0YXNhX2NyZWNpbWllbnRvKSAgDQogIA0KDQoNCkdHYWxseTo6Z2dwYWlycyhzdG9ja195X3Bvem9zX3Rhc2FzX3YyLCBsb3dlciA9IGxpc3QoY29udGludW91cyA9ICJzbW9vdGgiKSkNCnBsb3Qoc3RvY2tfeV9wb3pvc190YXNhc192MikNCg0KIyByb3VuZCh2YXIoc3RvY2tfeV9wb3pvc190YXNhcywgbmEucm0gPSBUUlVFKSwgNCkNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiNtYXRyaXogZGUgY29ycmVsYWNpb24NCmNvcl9wb3pvcyA8LSBjb3Ioc3RvY2tfeV9wb3pvc190YXNhc192MiwgdXNlID0gImNvbXBsZXRlLm9icyIpDQpjb3JfcG96b3MNCg0KIyAgZGlzdGludG9zIGNvcnJlbG9ncmFtYXMNCiNjb24gZ2djb3JycGxvdA0KbGlicmFyeShnZ2NvcnJwbG90KQ0KcC5tYXQgPSBjb3JfcG1hdChzdG9ja195X3Bvem9zX3Rhc2FzKQ0KZ2djb3JycGxvdChjb3JfcG96b3MsIGhjLm9yZGVyID0gVFJVRSwNCiAgICB0eXBlID0gImxvd2VyIiwgcC5tYXQgPSBwLm1hdCwgbGFiID0gVCkNCg0KIyAjICNjb24gY29ycnBsb3QNCiMgY29sIDwtIGNvbG9yUmFtcFBhbGV0dGUoYygiI0JCNDQ0NCIsICIjRUU5OTg4IiwgIiNGRkZGRkYiLCAiIzc3QUFERCIsICIjNDQ3N0FBIikpDQojIGNvcnJwbG90Ojpjb3JycGxvdChjb3JfcG96b3MsIG1ldGhvZD0iY29sb3IiLCBjb2w9Y29sKDIwMCksDQojICAgICAgICAgIHR5cGU9InVwcGVyIiwgb3JkZXI9ImhjbHVzdCIsDQojICAgICAgICAgIGFkZENvZWYuY29sID0gImJsYWNrIiwgIyBBZGQgY29lZmZpY2llbnQgb2YgY29ycmVsYXRpb24NCiMgICAgICAgICAgdGwuY29sPSJibGFjayIsIHRsLnNydD00NSwgI1RleHQgbGFiZWwgY29sb3IgYW5kIHJvdGF0aW9uDQojICAgICAgICAgICMgQ29tYmluZSB3aXRoIHNpZ25pZmljYW5jZQ0KIyAgICAgICAgICAjIHAubWF0ID0gcC5tYXQsDQojICAgICAgICAgICMgaW5zaWcgPSAiYmxhbmsiLA0KIyAgICAgICAgICBzaWcubGV2ZWwgPSAwLjAxKQ0KDQojICMgI2NvbiBnZ2dhbGx5DQojIEdHYWxseTo6Z2djb3JyKHN0b2NrX3lfcG96b3NfdGFzYXMsIG1ldGhvZCA9IGMoImNvbXBsZXRlLm9icyIsICJwZWFyc29uIikgLA0KIyAgICAgICAgICAgICAgICBsYWJlbCA9IFQsIGxhYmVsX3JvdW5kID0gMikNCmBgYA0KDQoNCiMjIyMjIFlQRg0KYGBge3J9DQpwcHllX3lwZiA8LSB5cGZfc2VnICU+JSANCiAgZmlsdGVyKHNlY3RvciAgPT0gInVwc3RyZWFtIiApICU+JSANCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKGZlY2hhKSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGlwY18xOCksIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZSh2YXJpYWJsZSA9ICJhY3Rpdm9fdXBzdHJlYW1feXBmIiwNCiAgICAgICAgIGFjdGl2b3MgPSBhY3Rpdm9zL2lwY18xOCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IiklPiUgDQogIHNlbGVjdChhbmlvLCBlbXByZXNhLCB1bmlkYWQgLCAgYWN0aXZvX3Vwc3RyZWFtPSBhY3Rpdm9zKSAlPiUgDQogIGxlZnRfam9pbihzdG9ja19iYWxhbmNlc19lbXByZXNhcyAlPiUgDQogICAgdW5ncm91cCgpICU+JSANCiAgICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgZW1wcmVzYSA9PSAiWVBGIikgJT4lDQogICAgc2VsZWN0KGFuaW8sIGVtcHJlc2EsIHVuaWRhZCwgcHB5ZV9pbnRlZ3JhZGEgPXZhbG9yKSAsIGJ5ID0gYygiYW5pbyIsICJlbXByZXNhIiwgInVuaWRhZCIpKSAlPiUgDQogIG11dGF0ZShhY3Rpdm9fdXBzdHJlYW0gPSB2YXJpYWNpb25faW50ZXJhbnVhbChhY3Rpdm9fdXBzdHJlYW0pLA0KICAgICAgICAgcHB5ZV9pbnRlZ3JhZGEgPSB2YXJpYWNpb25faW50ZXJhbnVhbChwcHllX2ludGVncmFkYSkpICU+JSANCiAgZnVsbF9qb2luKGxpc3RhZG9fcG96b3MgJT4lDQogICAgICAgICAgICAgIHNlbGVjdCgtZW1wcmVzYSkgJT4lIA0KICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoaWRlbXByZXNhID09ICJZUEYiKSAlPiUgDQogICAgICAgICAgICAgIHJlbmFtZShhbmlvID0gYW5pb190ZXJtaW5hY2lvbl9wb3pvLCBlbXByZXNhID0gaWRlbXByZXNhKSwgYnkgPSBjKCJhbmlvIiwgImVtcHJlc2EiKSApICU+JSANCiAgYXJyYW5nZShhbmlvKQ0KcHB5ZV95cGYNCg0KcHB5ZV95cGZfdGFzYXMgPC0gcHB5ZV95cGYgJT4lDQogICBhcnJhbmdlKGFuaW8pICU+JQ0KICBmaWx0ZXIoYW5pbyAlaW4lIDE5OTg6MjAxOCkgJT4lDQogIHNlbGVjdCgtYyhhbmlvLCBlbXByZXNhLCB1bmlkYWQpKSAlPiUNCiAgbXV0YXRlX2FsbCh0YXNhX2NyZWNpbWllbnRvKQ0KDQojbWF0cml6IGRlIGNvcnJlbGFjaW9uDQpjb3JfcG96b3NfeXBmIDwtIGNvcihwcHllX3lwZl90YXNhcywgdXNlID0gImNvbXBsZXRlLm9icyIpDQpjb3JfcG96b3NfeXBmDQoNCiMgIGRpc3RpbnRvcyBjb3JyZWxvZ3JhbWFzDQojY29uIGdnY29ycnBsb3QNCnAubWF0ID0gY29yX3BtYXQoY29yX3Bvem9zX3lwZikNCmdnY29ycnBsb3QoY29yX3Bvem9zX3lwZiwgaGMub3JkZXIgPSBUUlVFLA0KICAgIHR5cGUgPSAibG93ZXIiLCBwLm1hdCA9IHAubWF0LCBsYWIgPSBUKQ0KDQpHR2FsbHk6OmdncGFpcnMocHB5ZV95cGZfdGFzYXMsIGxvd2VyID0gbGlzdChjb250aW51b3VzID0gInNtb290aCIpKQ0KcGxvdChwcHllX3lwZl90YXNhcykNCmBgYA0KDQoNCmBgYHtyfQ0KI2HDsW9zIGJhc2VzDQphbmlvX2Jhc2VfeXBmX3NlZ21lbnRvIDwtICAgcHB5ZV95cGYkYWN0aXZvX3Vwc3RyZWFtW3BweWVfeXBmJGFuaW8gPT0gMjAwNl0NCg0KYW5pb19iYXNlX3lwZl9ib2xzYXIgPC0gcHB5ZV95cGYkcHB5ZV9pbnRlZ3JhZGFbcHB5ZV95cGYkYW5pbyA9PSAyMDA2XQ0KDQoNCnN0b2NrX3lfcG96b3NfeXBmIDwtICBwcHllX3lwZiAlPiUgDQogIG11dGF0ZShpbmRpY2VfcG96b3NfMDYgPSBnZW5lcmFyX2luZGljZShzZXJpZT0gcG96b3MgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhID0gYW5pbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9iYXNlID0gMjAwNikpICU+JSANCiAgbXV0YXRlKHBweWVfeXBmX2VzdGltYWRvID0gYW5pb19iYXNlX3lwZl9ib2xzYXIgKiBpbmRpY2VfcG96b3NfMDYsDQogICAgICAgICBhY3Rpdm9feXBmX2VzdGltYWRvID1hbmlvX2Jhc2VfeXBmX3NlZ21lbnRvICogaW5kaWNlX3Bvem9zXzA2LA0KICAgICAgICAgdW5pZGFkX3BweWU9Ik1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKQ0KDQpzdG9ja195X3Bvem9zX3lwZiAlPiUNCiAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9wcHllLCBwcHllX3lwZl9lc3RpbWFkbywgYWN0aXZvX3lwZl9lc3RpbWFkbykgJT4lDQogICAgICAgICAgIGdhdGhlcihrZXkgPSBlc3RpbWFjaW9uLA0KICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsb3IsIA0KICAgICAgICAgICAgICAgICAgIDM6NCkgJT4lIA0KICAgICAgICAgICBmaWx0ZXIoYW5pbyA+MTk2MCkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sdmFsb3IgLCBjb2xvciA9IGVzdGltYWNpb24pKSsNCiAgZ2VvbV9saW5lKCkrDQogIGxhYnMoeT0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiLCB0aXRsZSA9ICJFc3RpbWFjaW9uIGRlIEFjdGl2byB1c3B0cmVhbSB5IFBQeUUgZGUgWVBGIGEgcGFydGlyIGRlIGluZGljZSBkZSBwb3pvcyIpDQpgYGANCg0KIyMjIyMjIFBQeUUgeSBhY3Rpdm8gdXBzdHJlYW0gdG90YWwgcmFtYSBhIHBhcnRpciBkZSBZUEYNCg0KYGBge3J9DQpwb3pvc195ZnBfc29icmVfdG90YWwgPC0gbGlzdGFkb19wb3pvcyAlPiUNCiAgcmVuYW1lKGFuaW8gPSBhbmlvX3Rlcm1pbmFjaW9uX3Bvem8pICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UocG96b3NfY2FyZ2Fkb3Nfc2VjX2VuZXJnaWEgPSBzdW0ocG96b3MsIG5hLnJtID0gVCkpICU+JSANCiAgbGVmdF9qb2luKGxpc3RhZG9fcG96b3MgJT4lDQogICAgICAgICAgICAgIHJlbmFtZShhbmlvID0gYW5pb190ZXJtaW5hY2lvbl9wb3pvKSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihpZGVtcHJlc2EgPT0gIllQRiIpICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYW5pbywgaWRlbXByZXNhKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShwb3pvc19jYXJnYWRvc195cGYgPSBzdW0ocG96b3MsIG5hLnJtID0gVCkpKSAlPiUgDQogIG11dGF0ZSh5cGZfc29icmVfdG90YWwgPSBwb3pvc19jYXJnYWRvc195cGYvcG96b3NfY2FyZ2Fkb3Nfc2VjX2VuZXJnaWEpDQojIHBvem9zX3lmcF9zb2JyZV90b3RhbA0KDQplc3RpbWFjaW9uX3BweWVfdG90YWxfdmlhX3lwZiA8LSBzdG9ja195X3Bvem9zX3lwZiAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfcHB5ZSwgcHB5ZV95cGZfZXN0aW1hZG8sIGFjdGl2b195cGZfZXN0aW1hZG8pICU+JSANCiAgZ2F0aGVyKGtleSA9IGVzdGltYWNpb24sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLCANCiAgICAgICAgIDM6NCkgJT4lIA0KICBsZWZ0X2pvaW4ocG96b3NfeWZwX3NvYnJlX3RvdGFsICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHlwZl9zb2JyZV90b3RhbCkpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IveXBmX3NvYnJlX3RvdGFsLA0KICAgICAgICAgIGVzdGltYWNpb24gPSBjYXNlX3doZW4oZXN0aW1hY2lvbiA9PSAicHB5ZV95cGZfZXN0aW1hZG8iIH4gInBweWVfZXN0aW1hZG9fdG90YWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hY2lvbiA9PSAiYWN0aXZvX3lwZl9lc3RpbWFkbyIgfiAiYWN0aXZvX2VzdGltYWRvX3Vwc3RyZWFtIiApKQ0KICANCmVzdGltYWNpb25fcHB5ZV90b3RhbF92aWFfeXBmICU+JQ0KICAgICAgICAgICBmaWx0ZXIoYW5pbyA+MTk2MCkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sdmFsb3IgLCBjb2xvciA9IGVzdGltYWNpb24pKSsNCiAgZ2VvbV9saW5lKCkrDQogIGxhYnMoeT0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiLCANCiAgICAgICB0aXRsZSA9ICJFc3RpbWFjaW9uIGRlIEFjdGl2byB1c3B0cmVhbSB5IFBQeUUgdG90YWwgYSBwYXJ0aXIgZGUgYW1wbGlhY2nDs24gZGUgcG96b3MgWVBGIikNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KIyMgSW52ZXJzaW9uZXMNCg0KRnVlbnRlczogDQoNCiogQmFsYW5jZXMgZGUgQm9sc2FyLiBJbnZlcnNpw7NuIGNhbGN1bGFkYSBhIHBhcnRpciBkZSB2YXJpYWNpb25lcyBkZWwgYWN0aXZvICsgY29uc3VtbyBkZSBjYXBpdGFsIGZpam8gKGVzdG8gw7psdGltbyBlc3TDoSBwZW5kaWVudGUpDQoqIFNlY3JldGFyaWEgZGUgRW5lcmfDrWEuIFJlc29sdWNpw7NuIDIwNTcgDQogICsgW0ludmVyc2lvbmVzIHJlYWxpemFkYXMgYcOxbyBhbnRlcmlvcl0oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L2ludmVyc2lvbmVzLWVuLW1lcmNhZG8tZGUtaGlkcm9jYXJidXJvcy11cHN0cmVhbS9hcmNoaXZvLzI4NWQ0NWU1LTFiODgtNGRhZS04ZTVjLWMwMTg0M2M3YzhjMCkNCiAgKyBbSW52ZXJzaW9uZXMgYW51YWxlcyBwcmV2aXN0YXMgYSByZWFsaXphciBlbiBlbCBhw7FvIGRlIGxhIHByZXNlbnRhY2nDs24gZGUgbGEgRERKSl0oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L2ludmVyc2lvbmVzLWVuLW1lcmNhZG8tZGUtaGlkcm9jYXJidXJvcy11cHN0cmVhbSkNCg0KDQo0KSBjb25zdHJ1aXIgc2VyaWUgZGUgaW52ZXJzacOzbiBwYXJhIGF0cmFzIChidXNjYXIgU3RvY2sgZGUgWVBGIHBlcm8gc29sbyBwYXJhIGV4dHJhY2Npw7NuKS4gYXJtYXIgZWplcmNpY2lvIGRlIEZEIHkgdmVyIHNpIGxhcyBwcm9wb3JjaW9uZXMgc2UgbWFudGllbmVuLiANCg0KKiBSZWNvbnN0cnVjY2lvbiBkZSBzZXJpZSBkZSBpbnZlcnNpb24gcG9yIGVtcHJlc2ENCnZlciB1biBmbHVqbyBkZSBwb3pvcyB5IHVuIGZsdWpvIGRlIGludmVyc2lvbiB5IGx1ZWdvIHZlciBzaSBsbyBxdWUgbXVldmUgbGEgaW52ZXJzaW9uIHNvbiBsb3MgcG96b3MgKHF1ZSBzdSBldm9sdWNpb24gc2VhIHNpbWlsYXIpLiANCg0KLSBpbnZlcnNpb24gcG9yIGVtcHJlc2EgKGJhbGFuY2U6IHZhcmlhY2lvbiBkZWwgYWN0aXZvICsgY29uc3VtbyBkZSBLIGZpam8pDQotIGludmVyc2lvbiBwb3IgZW1wcmVzYSAoc2VjcmV0YXJpYSBkZSBlbmVyZ2lhKQ0KLSBpbnZlcnNpb24gYWdyZWdhZGEgKHRpcG8gZGUgaW52ZXJzaW9uKSAoY3VlbnRhcyBuYWNpb25hbGVzPykNCi0gcG96b3MgbnVldm9zIHBvciBlbXByZXNhIHBvciBhw7FvDQotIHBvem9zIG51ZXZvcyB0b3RhbGVzDQotIGFwbGljYXIgTUlQIHBhcmEgWVBGIA0KDQpJbnZlcnNpw7NuIGEgcGFydGlyIGRlIEJhbGFuY2VzDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQppbnZlcnNpb25lc19lbXByZXNhIDwtIHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoLWMoZnVlbnRlLCBzZWN0b3IpKSAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZSIpICU+JQ0KICBhcnJhbmdlKGVtcHJlc2EsIGFuaW8pICU+JSANCiAgZ3JvdXBfYnkodW5pZGFkLCB2YXJpYWJsZSwgZW1wcmVzYSkgJT4lDQogIG11dGF0ZSh2YWxvciA9IHZhcmlhY2lvbl9pbnRlcmFudWFsKHZhbG9yKSkNCiAgIA0KIyBpbnZlcnNpb25lc19lbXByZXNhDQoNCmdyYWZfaW52ZXJzaW9uZXNfZW1wcmVzYSA8LSBpbnZlcnNpb25lc19lbXByZXNhICU+JSANCiAgZmlsdGVyKGVtcHJlc2EgIT0gIkNhbXV6emkgR2FzIFBhbXBlYW5hIikgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGVtcHJlc2EpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgcG9yIGVtcHJlc2EiLA0KICAgICAgIHN1YnRpdGxlID0gIkEgcGFydGlyIGRlIGJhbGFuY2VzIiwNCiAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IiwNCiAgICAgICBjYXB0aW9uID0gIkJhbGFuY2VzIGRlIGVtcHJlc2FzIGV4dHJhw61kb3MgZGUgQm9sc2FyIikrDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlKQ0KIyBnZ3Bsb3RseShncmFmX2ludmVyc2lvbmVzX2VtcHJlc2EsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQoNCmBgYA0KDQoNCkludmVyc2nDs24gYSBwYXJ0aXIgZGUgU2VjcmV0YXJpYSBkZSBFbmVyZ8OtYQ0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvSW52ZXJzaW9uL1NlY3JldGFyaWEgZGUgRW5lcmdpYS9yZXNvbHVjaW4tMjA1Ny1pbnZlcnNpb25lcy1yZWFsaXphZGFzLWFvLWFudGVyaW9yLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoYEZlY2hhIEZpbiBUYXJlYXNgID0gY29sX2RhdGUoZm9ybWF0ID0gIiVkLyVtLyVZIiksIA0KICAgICAgICBgRmVjaGEgSW5pY2lvIFRhcmVhc2AgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJWQvJW0vJVkiKSkpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcOxbyBkZSBwcmVzZW50YWNpw7NuIGRlIGxhIERESkoiLA0KICAgICAgICAgZW1wcmVzYSA9ICJFbXByZXNhIGluZm9ybWFudGUiLA0KICAgICAgICAgY29uY2VwdG8gPSAiRGVzY3JpcGNpw7NuIGRlbCBwbGFuIGRlIGFjY2nDs24gKENvbmNlcHRvcykiLA0KICAgICAgICAgY2FudGlkYWRfZXhwbG9yYWNpb24gPSAiQ2FudC4gRXhwbG9yYWNpb24iLA0KICAgICAgICAgY2FudGlkYWRfZXhwbG90YWNpb24gPSAiQ2FudC4gRXhwbG90YWNpb24iLA0KICAgICAgICAgY2FudGlkYWRfZXhwbG9yYWNpb25fY29tcGxlbWVudGFyaWEgPSAiQ2FudC4gRXhwbG9yYWNpb24gQ29tcGxlbWVudGFyaWEiLA0KICAgICAgICAgZXhwbG9yYWNpb25fbWlsbG9uZXNfdXNkID0gIk1pbGxvbmVzIHUkcyBFeHBsb3JhY2lvbiIsDQogICAgICAgICBleHBsb3RhY2lvbl9taWxsb25lc191c2QgPSAiTWlsbG9uZXMgdSRzIEV4cGxvdGFjaW9uIiwNCiAgICAgICAgIGV4cGxvcmFjaW9uX2NvbXBsX21pbGxvbmVzX3VzZCA9ICJNaWxsb25lcyB1JHMgRXhwLiBDb21wbGVtZW50YXJpYSIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSBhbmlvIC0gMSwNCiAgICAgICAgIGVtcHJlc2EgPWNhc2Vfd2hlbihlbXByZXNhID09ICJZUEYgUy5BLiIgfiAiWVBGIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQQU4gQU1FUklDQU4gRU5FUkdZIChTVUNVUlNBTCBBUkdFTlRJTkEpIExMQyIgfiAiUEFFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQQU4gQU1FUklDQU4gRU5FUkdZIFNMIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBFVFJPQlJBUyBBUkdFTlRJTkEgUy5BLiIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQRVNBIChQRVRST0JSQVMgRS5TLkEuKSIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJFTkFQIFNJUEVUUk9MIEFSR0VOVElOQSBTLkEuIiB+ICJFTkFQIFNJUEVUUk9MIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJWSVNUQSBPSUwgJiBHQVMgQVJHRU5USU5BIFNBVSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0EiIH4gIlZpc3RhIE9pbCBhbmQgR2FzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJTSU5PUEVDIEFSR0VOVElOQSBFWFBMT1JBVElPTiBBTkQgUFJPRFVDVElPTiwgSU5DLiIgfiAiU2lub3BlYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVEVDUEVUUk9MIFMuQS4iIH4gIlRlY3BldHJvbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBMVVNQRVRST0wgUy5BLiIgfiAiUGx1c3BldHJvbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUExVU1BFVFJPTCBFTkVSR1kgUy5BLiIgfiAiUGx1c3BldHJvbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiQ09NUEHDkcONQSBHRU5FUkFMIERFIENPTUJVU1RJQkxFUyBTLkEuIiB+ICJDR0MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIldJTlRFUlNIQUxMIEVORVJHSUEgUy5BLiIgfiAiV2ludGVyc2hhbGwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIllTVVIgRU5FUkfDjUEgQVJHRU5USU5BIFMuUi5MLiIgfiAiWVNVUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiWVNVUiBQRVRST0xFUkEgQVJHRU5USU5BIFMuQS4iIH4gIllTVVIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlRPVEFMIEFVU1RSQUwgUy5BLiIgfiAiVG90YWwgQXVzdHJhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGVtcHJlc2EpKSAlPiUgDQogIHNlbGVjdChhbmlvLCBlbXByZXNhLCBpZGVtcHJlc2EsICBjb25jZXB0bywNCiAgICAgICAgIGNhbnRpZGFkX2V4cGxvcmFjaW9uLCBjYW50aWRhZF9leHBsb3RhY2lvbixjYW50aWRhZF9leHBsb3JhY2lvbl9jb21wbGVtZW50YXJpYSwNCiAgICAgICAgIGV4cGxvcmFjaW9uX21pbGxvbmVzX3VzZCxleHBsb3RhY2lvbl9taWxsb25lc191c2QsIGV4cGxvcmFjaW9uX2NvbXBsX21pbGxvbmVzX3VzZCApICU+JSANCiAgIyBmaWx0ZXIoc3RyX2RldGVjdChjb25jZXB0bywgJ3Bvem8nKSkgJT4lDQogIGdyb3VwX2J5KGVtcHJlc2EsIGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKGludmVyc2lvbl9leHBsb3RhY2lvbiA9IHN1bShleHBsb3RhY2lvbl9taWxsb25lc191c2QsIG5hLnJtID0gVCkpICU+JSANCiAgYXJyYW5nZSgtaW52ZXJzaW9uX2V4cGxvdGFjaW9uKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgVVNEIikNCmludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3INCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpyZXNvbHVjaW5fMjA1N19pbnZlcnNpb25lc19yZWFsaXphZGFzX21lbnN1YWwgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvSW52ZXJzaW9uL1NlY3JldGFyaWEgZGUgRW5lcmdpYS9yZXNvbHVjaW4tMjA1Ny1pbnZlcnNpb25lcy1yZWFsaXphZGFzLW1lbnN1YWwuY3N2IikNCg0KcmVzb2x1Y2luXzIwNTdfaW52ZXJzaW9uZXNfZmluX2NvbmNlc2lvbjwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0ludmVyc2lvbi9TZWNyZXRhcmlhIGRlIEVuZXJnaWEvcmVzb2x1Y2luLTIwNTctaW52ZXJzaW9uZXMtcmVhbGl6YWRhcy1maW4tZGUtY29uY2VzaW4uY3N2IikNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQppbnZlcnNpb25lc18yMDA1XzIwMTIgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9JbnZlcnNpb24vU2VjcmV0YXJpYSBkZSBFbmVyZ2lhL3RhYmxhcyBkaW5hbWljYXMvaW52ZXJzaW9uZXNfMjAwNV8yMDEyLnhsc3giLCANCiAgICBjb2xfdHlwZXMgPSBjKCJudW1lcmljIiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiKSwgDQogICAgc2tpcCA9IDgpICU+JSANCiAgcmVuYW1lKHBsYW5fMXJhX3NlbWFuYSA9ICJQbGFuIDHCqiBTZW0uIiwNCiAgICAgICAgIHBsYW5fYW51YWwgPSAiUGxhbiBBbnVhbCIsDQogICAgICAgICByZWFsaXphZG9fYW51YWwgPSAiUmVhbGl6YWRvIEFudWFsIiwNCiAgICAgICAgIGNvbmNlcHRvID0gQ29uY2VwdG8pICU+JSANCiAgbXV0YXRlKGFuaW8gPSAgem9vOjpuYS5sb2NmKGFuaW8pLA0KICAgICAgICAgZW1wcmVzYSA9ICB6b286Om5hLmxvY2YoZW1wcmVzYSksDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgVVNEIiwNCiAgICAgICAgIGVtcHJlc2EgPWNhc2Vfd2hlbihlbXByZXNhID09ICJZUEYgUy5BLiIgfiAiWVBGIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQQU4gQU1FUklDQU4gRU5FUkdZIChTVUNVUlNBTCBBUkdFTlRJTkEpIExMQyIgfiAiUEFFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQQU4gQU1FUklDQU4gRU5FUkdZIFNMIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBFVFJPQlJBUyBBUkdFTlRJTkEgUy5BLiIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQRVNBIChQRVRST0JSQVMgRS5TLkEuKSIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJFTkFQIFNJUEVUUk9MIEFSR0VOVElOQSBTLkEuIiB+ICJFTkFQIFNJUEVUUk9MIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJWSVNUQSBPSUwgJiBHQVMgQVJHRU5USU5BIFNBVSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0EiIH4gIlZpc3RhIE9pbCBhbmQgR2FzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJTSU5PUEVDIEFSR0VOVElOQSBFWFBMT1JBVElPTiBBTkQgUFJPRFVDVElPTiwgSU5DLiIgfiAiU2lub3BlYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVEVDUEVUUk9MIFMuQS4iIH4gIlRlY3BldHJvbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBMVVNQRVRST0wgUy5BLiIgfiAiUGx1c3BldHJvbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUExVU1BFVFJPTCBFTkVSR1kgUy5BLiIgfiAiUGx1c3BldHJvbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiQ09NUEHDkcONQSBHRU5FUkFMIERFIENPTUJVU1RJQkxFUyBTLkEuIiB+ICJDR0MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIldJTlRFUlNIQUxMIEVORVJHSUEgUy5BLiIgfiAiV2ludGVyc2hhbGwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIllTVVIgRU5FUkfDjUEgQVJHRU5USU5BIFMuUi5MLiIgfiAiWVNVUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiWVNVUiBQRVRST0xFUkEgQVJHRU5USU5BIFMuQS4iIH4gIllTVVIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlRPVEFMIEFVU1RSQUwgUy5BLiIgfiAiVG90YWwgQXVzdHJhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGVtcHJlc2EpKSAlPiUgDQogIGZpbHRlcighKGVtcHJlc2EgJWluJSBjKCJPJkcgREVWRUxPUE1FTlRTIExURCBTLkEuIiAsIlBFVFJPTUlORVJBIENIVUJVVCBTLkUuIikpKSAlPiUNCiAgIyBmaWx0ZXIoc3RyX2RldGVjdChjb25jZXB0bywgJ3Bvem8nKSkgJT4lDQogIGdyb3VwX2J5KGVtcHJlc2EsIGFuaW8sIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UoaW52ZXJzaW9uX2FudWFsID0gc3VtKHJlYWxpemFkb19hbnVhbCwgbmEucm0gPSBUKSkgJT4lIA0KICBhcnJhbmdlKC1pbnZlcnNpb25fYW51YWwpDQppbnZlcnNpb25lc18yMDA1XzIwMTINCg0KDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpncmFmX2ludmVyc2lvbmVzXzIwMDVfMjAxMiA8LSAgaW52ZXJzaW9uZXNfMjAwNV8yMDEyICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8sIGludmVyc2lvbl9hbnVhbCwgY29sb3IgPSBlbXByZXNhKSkrIA0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIkludmVyc2lvbmVzIHBvciBlbXByZXNhICh0YWJsYXMgZGluYW1pY2FzKSIsDQogICAgICAgc3VidGl0bGUgPSAiRXh0cmHDrWRvIGRlIHRhYmxhcyBkaW7DoW1pY2FzIiwNCiAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiLA0KICAgICAgIGNhcHRpb24gPSAiU2VjcmV0YXJpYSBkZSBFbmVyZ8OtYSIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpnZ3Bsb3RseShncmFmX2ludmVyc2lvbmVzXzIwMDVfMjAxMiwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCg0KZ3JhZl9pbnZlcnNpb25lc19hbmlvX2FudGVyaW9yIDwtICBpbnZlcnNpb25lc19hbmlvX2FudGVyaW9yICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8sIGludmVyc2lvbl9leHBsb3RhY2lvbiwgY29sb3IgPSBlbXByZXNhKSkrIA0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIkludmVyc2lvbmVzIHBvciBlbXByZXNhIChhw7FvIGFudGVyaW9yKSIsDQogICAgICAgc3VidGl0bGUgPSAiSW52ZXJzaW9uZXMgYcOxbyBhbnRlcmlvciIsDQogICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIiwNCiAgICAgICBjYXB0aW9uID0gIlNlY3JldGFyaWEgZGUgRW5lcmfDrWEiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KZ2dwbG90bHkoZ3JhZl9pbnZlcnNpb25lc19hbmlvX2FudGVyaW9yLCB3aWR0aCA9IDcwMCwgaGVpZ2h0ID0gNDUwKQ0KDQpgYGANCg0KDQojIyMgQW7DoWxpc2lzIGRlIGNvcnJlbGFjacOzbiBlbnRyZSBJbnZlcnNpw7NuIHkgUG96b3MNCg0KLSBidXNjYXIgY29ycmVsYWNpb24sIHBhcmEgdmVyIHNpIGxhIHNlcmllIGRlIGludmVyc2nDs24gc2UgbXVldmUgc2ltaWxhciBhIGxvcyBwb3pvcw0KLSB1c2FyIHN0b2NrIHkgYWRlbWFzIHVzYXIgdmFyaWFjaW9uIGRlIHN0b2NrIChicyBkZSB1c28pDQoNCkNvbiBwb3pvcyBkZSBJQVBHDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBjb24gaW52ZXJzaW9uZXMgcmVhbGl6YWRhcyBhw7FvIGFudGVyaW9yDQppbnZlcnNpb25fcG96b3MgPC0gcG96b3NfaWFwZyAlPiUgDQogIGxlZnRfam9pbihpbnZlcnNpb25lc19hbmlvX2FudGVyaW9yICU+JQ0KICAgICAgICAgICAgICB1bmdyb3VwKCksIGJ5ID0gYygiZW1wcmVzYSIsICJhbmlvIikpICU+JSANCiAgbXV0YXRlKGludmVyc2lvbl9wb3JfcG96byA9IGludmVyc2lvbl9leHBsb3RhY2lvbiAvdG90YWxfcG96b3MpDQoNCiNjb24gaW52ZXJzaW9uZXMgYW51bmNpYWRhcw0KaW52ZXJzaW9uX3Bvem9zXzIgPC0gcG96b3NfaWFwZyAlPiUgDQogIGxlZnRfam9pbihpbnZlcnNpb25lc18yMDA1XzIwMTIgJT4lDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSwgYnkgPSBjKCJlbXByZXNhIiwgImFuaW8iKSkgJT4lIA0KICBtdXRhdGUoaW52ZXJzaW9uX3Bvcl9wb3pvID0gaW52ZXJzaW9uX2FudWFsIC90b3RhbF9wb3pvcykNCg0KI2VzdGEgbWFsIHBxIGVzIGZsdWpvIGRlIHBvem9zIHZzIHN0b2NrIGRlIGNhcGl0YWwNCiMga3RhX3Bvem9zIDwtIHBvem9zX2lhcGcgJT4lIA0KIyAgIGxlZnRfam9pbihzdG9ja19iYWxhbmNlc19lbXByZXNhcyAlPiUNCiMgICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lIA0KIyAgICAgICAgICAgICAgIHNlbGVjdCgtc2VjdG9yKSwgYnkgPSBjKCJlbXByZXNhIiwgImFuaW8iKSkgJT4lIA0KIyAgIG11dGF0ZShwcHllX3Bvcl9wb3pvID0gcHJvcF9wbGFudF9lcXVpcCAvdG90YWxfcG96b3MpDQoNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfaW52ZXJzaW9uX3Bvem8gPC0gaW52ZXJzaW9uX3Bvem9zICU+JSANCiAgZmlsdGVyKCBhbmlvID49IDIwMTIpICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8saW52ZXJzaW9uX3Bvcl9wb3pvLCBjb2xvciA9IGVtcHJlc2EgKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgYcOxbyBhbnRlcmlvciBzb2JyZSBwb3pvcyBJQVBHIiwgDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiKSsNCiAgdGhlbWVfY2xhc3NpYygpDQpnZ3Bsb3RseShncmFmX2ludmVyc2lvbl9wb3pvLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KDQpncmFmX2ludmVyc2lvbl9wb3pvXzIgPC0gaW52ZXJzaW9uX3Bvem9zXzIgJT4lIA0KICBmaWx0ZXIoIGFuaW8gPD0gMjAxMikgJT4lDQogIGdncGxvdChhZXMoYW5pbyxpbnZlcnNpb25fcG9yX3Bvem8sIGNvbG9yID0gZW1wcmVzYSApKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpb25lcyByZWFsaXphZGFzIHNvYnJlIHBvem9zIElBUEciLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkNCmdncGxvdGx5KGdyYWZfaW52ZXJzaW9uX3Bvem9fMiwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQpDb24gcG96b3MgQ2FwIElWDQpgYGB7ciBlY2hvPUZBTFNFfQ0KIyBjb24gaW52ZXJzaW9uZXMgcmVhbGl6YWRhcyBhw7FvIGFudGVyaW9yDQppbnZlcnNpb25fcG96b3NfY2FwaXYgPC0gbGlzdGFkb19wb3pvcyAlPiUNCiAgcmVuYW1lKGFuaW8gPWFuaW9fdGVybWluYWNpb25fcG96bykgJT4lIA0KICBsZWZ0X2pvaW4oaW52ZXJzaW9uZXNfYW5pb19hbnRlcmlvciAlPiUNCiAgICAgICAgICAgICAgdW5ncm91cCgpLCBieSA9IGMoImVtcHJlc2EiLCAiYW5pbyIgKSkgJT4lDQogIG11dGF0ZShpbnZlcnNpb25fcG9yX3Bvem8gPSBpbnZlcnNpb25fZXhwbG90YWNpb24gL3Bvem9zKQ0KDQpncmFmX2ludmVyc2lvbl9wb3pvIDwtIGludmVyc2lvbl9wb3pvc19jYXBpdiAlPiUgDQogIGZpbHRlciggYW5pbyA+PSAyMDEyKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLGludmVyc2lvbl9wb3JfcG96bywgY29sb3IgPSBlbXByZXNhICkpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIkludmVyc2lvbmVzIGHDsW8gYW50ZXJpb3Igc29icmUgcG96b3MgQ2FwaXR1bG8gSVYiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmdncGxvdGx5KGdyYWZfaW52ZXJzaW9uX3Bvem8sIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA0MDApDQoNCg0KYGBgDQoNCiMjIFJlZ2Fsw61hcw0KDQoqIEZ1ZW50ZXM6IA0KICArIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIChCYXNlIFJlZ2Fsw61hcykNCg0KDQpSRVZJU0FSIEVMIENBTENVTE8gREUgQkVUQU5JQSANCmN1YW50byBnYW5hcmlhbiBsYXMgcHJvdmluY2lhcyBzaSBlbCBwcmVjaW8gZGVsIG1lcmNhZG8gaW50ZXJubyBzZSBhY29tb2RhIGFsIGludGVybmFjaW9uYWw/DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojcmVnYWxpYXMNCiNmaWx0cm8gY29uIHByb2R1Y3Rvcw0KcHJvZHVjdG9zIDwtIGxpc3QoImNydWRvIiwgImdhcyIsICJnYXNvbGluYSIsICJnbHAiKQ0KDQojbG9vcCBwYXJhIGxldmFudGFyIGxhcyBiYXNlcw0KbGlzdGFfcmVnYWxpYXMgPSBsaXN0KCkNCmZvcihpIGluIHByb2R1Y3Rvcyl7DQogIHJlZ2FsaWFzX2kgPC0gcmVhZF9kZWxpbShwYXN0ZTAoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvcmVnYWxpYXNfIiwgaSwgIi5jc3YiKSwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFLCANCiAgICBza2lwID0gMSkNCiAgbGlzdGFfcmVnYWxpYXNbW2ldXSA8LSByZWdhbGlhc19pDQp9DQoNCiNiYXNlcyBpbmRpdmlkdWFsZXMNCnJlZ2FsaWFzX2NydWRvIDwtIGxpc3RhX3JlZ2FsaWFzJGNydWRvICU+JSANCiAgbXV0YXRlKG1vbmVkYSA9ICJVU0QiLA0KICAgICAgICAgcHJvZHVjdG8gPSAiY3J1ZG8iKQ0KcmVnYWxpYXNfZ2FzIDwtIGxpc3RhX3JlZ2FsaWFzJGdhcyAlPiUgDQogIG11dGF0ZShtb25lZGEgPSAiYXJzIiwNCiAgICAgICAgIHByb2R1Y3RvID0gImdhcyIpDQpyZWdhbGlhc19nYXNvbGluYSA8LSBsaXN0YV9yZWdhbGlhcyRnYXNvbGluYSAlPiUgDQogIG11dGF0ZShtb25lZGEgPSAiVVNEIiwNCiAgICAgICAgIHByb2R1Y3RvID0gImdhc29saW5hIikNCnJlZ2FsaWFzX2dscCA8LSBsaXN0YV9yZWdhbGlhcyRnbHAgJT4lIA0KICBtdXRhdGUobW9uZWRhID0gImFycyIsDQogICAgICAgICBwcm9kdWN0byA9ICJnbHAiKQ0KDQojYmFzZSBjb21wbGV0YQ0KcmVnYWxpYXMgPC0gIHJlZ2FsaWFzX2NydWRvICU+JSANCiAgYmluZF9yb3dzKHJlZ2FsaWFzX2dhcywgcmVnYWxpYXNfZ2Fzb2xpbmEsIHJlZ2FsaWFzX2dscCkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw5FPIiwNCiAgICAgICAgIG1lcyA9ICJNRVMiLCANCiAgICAgICAgIHJlZ2FsaWFzX3RvdGFsID0gIlRPVEFMIFBST1ZJTkNJQSIpICU+JSANCiAgbXV0YXRlKGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIG1lcyksIG9yZGVycyA9ICJ5bSIpKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGFuaW8sIG1lcywgcHJvZHVjdG8sIG1vbmVkYSwgcmVnYWxpYXNfdG90YWwsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgZ3JvdXBfYnkocHJvZHVjdG8sIGFuaW8sIG1vbmVkYSApICU+JSANCiAgc3VtbWFyaXNlKHJlZ2FsaWFzX3RvdGFsID0gc3VtKHJlZ2FsaWFzX3RvdGFsKSkgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsICU+JSBzZWxlY3QoLVRDUCkpICU+JSANCiAgbXV0YXRlKHJlZ2FsaWFzX3RvdGFsID0gY2FzZV93aGVuKG1vbmVkYSA9PSAiVVNEIiB+IHJlZ2FsaWFzX3RvdGFsICogVENDLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHJlZ2FsaWFzX3RvdGFsKSwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMiKSAlPiUgDQogIHNlbGVjdCgtYyhUQ0MsIG1vbmVkYSkpDQoNCnJlZ2FsaWFzDQoNCnJlZ2FsaWFzX3VzZCA8LSByZWdhbGlhcyAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYykpICU+JSANCiAgbXV0YXRlKHJlZ2FsaWFzID0gcmVnYWxpYXNfdG90YWwgL3RjYywgDQogICAgICAgICB1bmlkYWQgPSAiVVNEIikgJT4lIA0KICBzZWxlY3QoLWMocmVnYWxpYXNfdG90YWwsIHRjYykpDQoNCmBgYA0KDQojIyBTdWJzaWRpb3MNCmBgYHtyfQ0KIyBDRUZJUCBjb250IGV0IGFsLiBTdWJzaWRpb3MgY29tbyAlIGRlbCBQQkkNCnN1YnNpZGlvc19jZWZpcCA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9zdWJzaWRpb3Mvc3Vic2lkaW9zLnhsc3giKSAlPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSBzdWJzaWRpb3NfcG9yY2VudGFqZV9wYmksDQogICAgICAgICAyOm5jb2woLikpICU+JSANCiAgZmlsdGVyKHNlY3RvciAlaW4lIGMoIkNBTU1FU0EiLCAiUGxhbiBHYXMiLCJFTkFSU0EiLCAiU3Vic2lkaW9zIEZGIEdOIHkgR0xQIikpICU+JSANCiAgbXV0YXRlKGFuaW8gPSBhcy5kb3VibGUoYW5pbykpICU+JSANCiAgbGVmdF9qb2luKGdhbmFuY2lhX3lfcGJpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHBiaSkpICU+JQ0KICBtdXRhdGUoc3Vic2lkaW9zX3BvcmNlbnRhamVfcGJpPWFzLmRvdWJsZShzdWJzaWRpb3NfcG9yY2VudGFqZV9wYmkpLA0KICAgICAgICAgc3Vic2lkaW9zX2NlZmlwID0gc3Vic2lkaW9zX3BvcmNlbnRhamVfcGJpICogcGJpICogMTBeNikgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZSh1bmlkYWQgPSAiUGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICAgICBzdWJzaWRpb3NfY2VmaXA9c3VtKHN1YnNpZGlvc19jZWZpcCwgbmEucm0gPSBUKSkNCg0KI2VqZXMgDQpzdWJzaWRpb3NfZWplcyA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9zdWJzaWRpb3MueGxzeCIgKSAlPiUgDQogIHJlbmFtZShzdWJzaWRpb3NfdXNkID0gc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MpICU+JSANCiAgcmlnaHRfam9pbih0Y3BfYW51YWxfYiAlPiUgDQogICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdGNjKSwgYnkgPSAiYW5pbyIpICU+JQ0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZSh1bmlkYWQgPSAiUGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBzdWJzaWRpb3NfZWplcyA9IHN1YnNpZGlvc191c2QqdGNjKjEwXjYpDQoNCnN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zIDwtIHN1YnNpZGlvc19lamVzJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBzdWJzaWRpb3NfZWplcykgJT4lIA0KICBmdWxsX2pvaW4oc3Vic2lkaW9zX2NlZmlwLCBieSA9YygiYW5pbyIsICJ1bmlkYWQiKSkgJT4lIA0KICBhcnJhbmdlKC1hbmlvKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiUGVzb3MgY29ycmllbnRlcyIpDQogICAgICAgICAjIHggPSBzdWJzaWRpb3NfY2VmaXAvc3Vic2lkaW9zX2VqZXMpDQpzdWJzaWRpb3NfaGlkcm9jYXJidXJvcyAgDQpgYGANCg0KDQoNCiMgVmFsb3IgdG90YWwgZGUgbGEgcHJvZHVjY2nDs24gIA0KDQoNCiMjIENyaXRlcmlvcyBtZXRvZG9sw7NnaWNvcyANClNlIHByZXNlbnRhbiBhIGNvbnRpbnVhY2nDs24gZGlzdGludGFzIGVzdGltYWNpb25lcyBzb2JyZSBsYSBtYWduaXR1ZCBkZSByaXF1ZXphIHByZXNlbnRlIGVuIGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybzogVmFsb3IgQnJ1dG8geSBBZ3JlZ2FkbyBkZSBQcm9kdWNjacOzbiAoVkJQIHkgVkEpLCBDb25zdW1vIEludGVyZW1lZGlvIChDSSksIE1hc2EgU2FsYXJpYWwgKE1TKSB5IEV4Y2VkZW50ZSBCcnV0byBkZSBFeHBsb3RhY2nDs24gKEVCRSkuIEVsIFZCUCBzdXJnZSBkZSBsYSB2YWx1YWNpw7NuIGRlIGxhIHByb2R1Y2Npw7NuIGEgc3VzIHByZWNpb3MgY29ycmVzcG9uZGllbnRlcy4gRWwgVkEgcmVzdWx0YSBkZSBsYSBkaWZlcmVuY2lhIGVudHJlIGVsIFZCUCB5IENJLCBlbCBjdWFsIHB1ZWRlIHN1cmdpciBvcmlnaW5hbG1lbnRlIGRlIGVzdGEgcmVzdGEgbyBhIHBhcnRpciBkZWwgY29lZmljaWVudGUgdMOpY25pY28gZGUgbGEgTWF0cml6IEluc3VtbyBQcm9kdWN0byAoTUlQKS4gRWwgRUJFIGNvbnN0aXR1eWUgbGEgcGx1c3ZhbMOtYSAoUFYpIHRvdGFsIGRlIGxhIHJhbWEsIGVzIGRlY2lyLCBsYSBzdW1hIGRlIGxhIHJlbnRhIGRlIGxhIHRpZXJyYSAoUlQpIG3DoXMgbGEgZ2FuYW5jaWEgbm9ybWFsIChHbm9ybSksIHkgc2Ugb2J0aWVuZSBsdWVnbyBkZSBkZXNjb250YXIgbGEgTVMgeSBsb3MgaW1wdWVzdG9zIGVzcGVjw61maWNvcyAoSW1wKSBkZWwgVkEuIEVuIHRvZG9zIGxvcyBjYXNvcyBxdWUgc2UgcHJlc2VudGFyw6FuIGEgY29udGludWFjacOzbiwgbG9zIEltcCBzZSBjYWxjdWxhcm9uIGEgcGFydGlyIGRlIGFwbGljYXIgc29icmUgZWwgVkJQIHVuIGNvZWZpY2llbnRlICByZXN1bHRhbnRlIGRlbCBwZXNvIGRlIGxvcyBpbXB1ZXN0b3MgcHJvbWVkaW8gZGUgbGEgIE1JUCBkZSAxOTk3LiBMbyBtaXNtbyBwYXNhIGNvbiBsYSBlc3RpbWFjacOzbiBkZSBsYSBkZXByZWNpYWNpw7NuIGRlIGNhcGl0YWwgbyBjb25zdW1vIGRlIGNhcGl0YWwgZmlqbyAoQ29uc0tmaWpvKSwgcXVlIHNlIG9idGllbmUgYSBwYXJ0aXIgZGUgYXBsaWNhciBsYSB0YXNhIGRlIGRlcHJlY2lhY2nDs24gcHJvbWVkaW8gcmVzdWx0YW50ZSBkZSBsb3MgYmFsYW5jZXMgZGUgWVBGICgxOTk4IC0gMjAxOCkgc29icmUgZWwgdG90YWwgZGUgUHJvcGllZGFkLCBQbGFudGEgeSBFcXVpcG8gKFBQeUUpIGRlIGxhIHJhbWEuIEVzdGEgcGFydGlkYSBzZSBhcGxpY2EgcGFyYSBvYnRlbmVyIGVsIEV4Y2VkZW50ZSBOZXRvIGRlIEV4cGxvdGFjacOzbi4gU2UgcHJlc2VudGFuIGRpc3RpbnRhcyBlc3RpbWFjaW9uZXMgcGFyYSBlbCBWQlAsIENJIHkgTVMsIHF1ZSBsdWVnbyBzZSBvYnNlcnZhcsOhbiBlbiBsYSBmb3JtdWxhY2nDs24gbWF0ZW3DoXRpY2E6DQoNCg0KDQoqIENDTk4gKCpjY25uX29maWNpYWwqKQ0KICArIFZhbG9yZXMgY29udGFibGVzIG9maWNpYWxlcyBkZSBsYXMgQ3VlbnRhcyBOYWNpb25hbGVzIChzw7NsbyBkaXNwb25pYmxlIHBhcmEgZWwgcGVyw61vZG8gMjAwNC0yMDEyKS4gRGFkbyBxdWUgc2UgcHJlc2VudGFuIHNlcmllcyBkZSBWQlAgeSBWQSwgc2UgcHVkbyBlc3RpbWFyIGVsIENJIGNvbW8gbGEgZGlmZXJlbmNpYSBkZSBkaWNoYXMgY3VlbnRhcy4gU2UgcHJvY2VkacOzIGEgc2VwYXJhciBlbCBWQlAgYSBwYXJ0aXIgZGVsIHBlc28gZGVsIFZCUCBkZSBsb3Mgc2VydmljaW9zIGRlIGFwb3lvIGEgbGEgZXh0cmFjY2nDs24gc29icmUgZWwgVkJQIGRlIGV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyB5IGdhcywgcHJlc2VudGUgZW4gZWwgQ3VhZHJvIGRlIFV0aWxpemFjacOzbiBkZSBPZmVydGEgKENPVSkgZGUgMjAwNCBkZSBJTkRFQy4gU2UgZGVzY29udMOzIGVzdGEgcHJvcG9yY2nDs24gKHJlc3VsdGFudGUgZGVsIDEwLDclKSBkZWwgVkJQIHRvdGFsIHBhcmEgb2J0ZW5lciB1biBWQlAgc8OzbG8gZGUgZXh0cmFjY2nDs24uIERhZG8gcXVlIHNlIHBvc2VlIGluZm9ybWFjacOzbiBkZWwgc2FsYXJpbyBwcm9tZWRpbyBkZWwgc2VjdG9yIHkgZWwgZW1wbGVvLCBzZSBwdWRvIG9idGVuZXIgbGEgTVMgcmVzdWx0YW50ZSwgdGFudG8gcGFyYSBlbCB0b3RhbCBkZWwgc2VjdG9yIChleHRyYWNjacOzbiB5IHNlcnZpY2lvcyByZWxhY2lvbmFkb3MpIGNvbW8gcGFyYSBzw7NsbyBleHRyYWNjacOzbi4gQSBwYXJ0aXIgZGUgZXN0b3MgZGF0b3Mgc2UgZWxhYm9yw7MgdW4gY29lZmljaWVudGUgcXVlIHJlZmxlamEgZWwgcHJvbWVkaW8gZGUgbGEgcHJvcG9yY2nDs24gZGUgbGEgTVMgc29icmUgZWwgVkJQIHF1ZSBzZSB1dGlsaXphcsOhIGVuIGPDoWxjdWxvcyBwb3N0ZXJpb3JlcyBkZSBNUyB0b3RhbCB5IE1TIGRlIGV4dHJhY2Npw7NuLiANCg0KKiBFc3RpbWFjacOzbiBwcm9waWEgY29uIGNyaXRlcmlvIENDTk4gKCp2YnBfdmFfY2lfcHJvcGlhKikNCiAgKyBFc3RpbWFjacOzbiBwcm9waWEgZGUgbG9zIHZhbG9yZXMgY29udGFibGVzIGEgcGFydGlyIGRlIGxhcyBmdWVudGVzIHJlY29waWxhZGFzLCBzaWd1aWVuZG8gbG9zIGNyaXRlcmlvcyBkZSBsYXMgQ3VlbnRhcyBOYWNpb25hbGVzLiBFcyBkZWNpciwgcGFyYSBvYnRlbmVyIGVsIFZCUCBzZSB2YWx1YSBsYSBwcm9kdWNjacOzbiBkZXN0aW5hZGEgYWwgbWVyY2FkbyBpbnRlcm5vIChyZXN1bHRhbnRlIGEgcGFydGlyIGRlIGxhIGRpZmVyZW5jaWEgZW50cmUgcHJvZHVjY2nDs24geSBleHBvcnRhY2lvbmVzKSBjb24gbG9zIHByZWNpb3MgaW50ZXJub3MgeSBsYXMgZXhwb3J0YWNpb25lcyBjb24gbG9zIHByZWNpb3MgZGUgZXhwb3J0YWNpw7NuLCB2YWx1YWRvcyB0aXBvIGRlIGNhbWJpbyBjb21lcmNpYWwgKFRDQykuIFNlIHByb2NlZGnDsyB0YW1iacOpbiBhIHNlcGFyYXIgZWwgVkJQIGRlIGV4dHJhY2Npw7NuIG5ldG8gZGUgbG9zIHNlcnZpY2lvcyB0YWwgY29tbyBzZSBleHBsaWPDsyBhbnRlcmlvcm1lbnRlLiBFbCBDSSBzZSBlc3RpbcOzIGEgcGFydGlyIGRlIGFwbGljYXIgZWwgY29lZmljaWVudGUgdMOpY25pY28gKHJhdGlvIENJL1ZCUCkgcmVzdWx0YW50ZSBkZSBsYSBNSVAgZGUgMTk5NyAoZXF1aXZhbGVudGUgYSAwLjI3MikuIERlIGlndWFsIG1hbmVyYSwgcGFyYSBjYWxjdWxhciBsYSBtYXNhIHNhbGFyaWFsIHNlIGFwbGljw7MgZWwgY29lZmljaWVudGUgZGUgTVMgbWVuY2lvbmFkbyBhbnRlcmlvcm1lbnRlLiBGaW5hbG1lbnRlLCBjb21vIHNlIG1lbmNpb27DsyBhbnRlcmlvcm1lbnRlLCBlbCBWQSBlbCBFQkUgc2UgY2FsY3VsYXJvbiBhIHBhcnRpciBkZSBsYXMgZGlmZXJlbmNpYXMgbWVuY2lvbmFkYXMgYW50ZXJpb3JtZW50ZS4gDQoNCiogRW1wYWxtZSBDQ05OICgqdmJwX2Njbm4qKQ0KICArIEVzdGltYWNpw7NuIHF1ZSB0b21hIGxvcyB2YWxvcmVzIG9maWNpYWxlcyBkZSBsYXMgY3VlbnRhcyBuYWNpb25hbGVzIHBhcmEgZWwgcGVyw61vZG8gZG9uZGUgc2UgcHJlc2VudGFuIGRhdG9zICgyMDA0IC0yMDEyKSB5IHF1ZSBpbXB1dGEgbG9zIHZhbG9yZXMgZmFsdGFudGVzIHBvciBtZWRpbyBkZSBsYSBldm9sdWNpw7NuIGRlbCDDrW5kaWNlIGRlbCBWQlAgcHJvcGlvIGNvbiBjcml0ZXJpbyBDQ05OIGV4cGxpY2FkbyBhbnRlcmlvcm1lbnRlLiBBc2ltaXNtbywgc2UgdXRpbGl6YXJvbiBsb3MgdmFsb3JlcyBvZmljaWFsZXMgZGUgbGEgTVMgY3VhbmRvIHNlIGVuY29udHJhYmEgZGlzcG9uaWJsZSBlbCBkYXRvICgxOTk2LTIwMTgpLCBtaWVudHJhcyBxdWUgc2UgdXRpbGl6w7MgZWwgdmFsb3IgcHJvcGlvIGVzdGltYWRvIGNvbiBjcml0ZXJpbyBkZSBsYXMgQ0NOTiBwYXJhIGxvcyByZXN0YW50ZXMgYcOxb3MuIA0KICANCiogQ3JpdGVyaW8gUHJvcGlvICgqcHZfaGlkcm9jYXJidXJvc19wcm9waWEqKQ0KICArIEVzdGltYWNpw7NuIHByb3BpYSBxdWUgcmVmbGVqYSBjb24gbWF5b3IgcHJlY2lzacOzbiBlbCB2YWxvciBkZSBsYSByaXF1ZXphIHRvdGFsIHByZXNlbnRlIGVuIGVsIHNlY3Rvci4gRWwgVkJQIHNlIG9idGllbmUgYSBwYXJpdHIgZGUgdmFsdWFyIGxhIHRvdGFsaWRhZCBkZSBsYSBwcm9kdWNjacOzbiBhIGxvcyBwcmVjaW9zIGV4dGVybm9zIG8gZGUgcmVmZXJlbmNpYSBpbnRlcm5hY2lvbmFsIHkgY29uIGVsIHRpcG8gZGUgY2FtYmlvIGRlIHBhcmlkYWQgKFRDUCksIHF1ZSBtaWRlIGxhIGNhcGFjaWRhZCByZWFsIGRlIGNvbXByYSBkZSBsYSBtb25lZGEgbmFjaW9uYWwuIFNpbiBlbWJhcmdvLCBjb21vIGVsIENJIGNvbnN0aXR1eWUgaW50ZXJjYW1iaW9zIGRlIG1lcmNhbmPDrWFzIHJlYWxpemFkYXMgZW4gZWwgw6FtYml0byBuYWNpb25hbCwgZGljaGEgcGFydGlkYSBzZSBvYnRpZW5lIGEgcGFydGlyIGRlIGxvcyB2YWxvcmVzIG9idGVuaWRvcyBlbiBsYSBzZXJpZSBkZSBlbXBhbG1lIENDTk4uIERlIGlndWFsIG1hbmVyYSwgc2UgdXRpbGl6w7MgbGEgTVMgcmVzdWx0YW50ZSBkZSBlc3RhIMO6bHRpbWEgZXN0aW1hY2nDs24uIA0KDQoNCg0KDQojIyBGb3JtdWxhY2nDs24gbWF0ZW3DoXRpY2EgZGUgZXN0aW1hY2lvbmVzDQoNClZhbG9yIEJydXRvIGRlIFByb2R1Y2Npw7NuIHRvdGFsLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gcHJvcGlvDQokJFZCUF97cHJvcGlhfSA9IChQZXh0X3twZXRyw7NsZW99ICogUV97cGV0csOzbGVvfSArIFBleHRfe2dhc30gKiBRX3tnYXN9KSAqIFRDUCQkDQoNCkRvbmRlOiANCg0KKiAkVkJQX3twcm9waWF9JCA9IFZhbG9yIEJydXRvIGRlIGxhIFByb2R1Y2Npw7NuIHRvdGFsLCBlc3RpbWFjacOzbiBwcm9waWENCiogJFBleHRfe3BldHLDs2xlb30kID0gUHJlY2lvIGRlIGV4cG9ydGFjacOzbiBvIHJlZmVyZW5jaWEgaW50ZXJuYWNpb25hbCBkZWwgcGV0csOzbGVvIGNydWRvIChzZWfDum4gY29ycmVzcG9uZGEpDQoqICRQZXh0X3tnYXN9JCA9IFByZWNpbyBkZSBleHBvcnRhY2nDs24gbyByZWZlcmVuY2lhIGludGVybmFjaW9uYWwgZGVsIGdhcyBuYXR1cmFsIChzZWfDum4gY29ycmVzcG9uZGEpDQoqICRRX3twZXRyw7NsZW99JCA9IENhbnRpZGFkZXMgcHJvZHVjaWRhcyB0b3RhbGVzIGRlIHBldHLDs2xlbyBjcnVkbw0KKiAkUV97Z2FzfSQgPSBDYW50aWRhZGVzIHByb2R1Y2lkYXMgdG90YWxlcyBkZSBnYXMgbmF0dXJhbA0KKiAkVENQJCA9IFRpcG8gZGUgQ2FtYmlvIGRlIFBhcmlkYWQNCg0KDQpWYWxvciBCcnV0byBkZSBQcm9kdWNjacOzbiB0b3RhbCwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCiQkVkJQX3tDQ05OfSA9IChQaW50X3twZXRyw7NsZW99ICogUU1JbnRfe3BldHLDs2xlb30gKyBQZXh0X3twZXRyw7NsZW99ICogRXhwb197cGV0csOzbGVvfSArIFBpbnRfe2dhc30gKiBRTUludF97Z2FzfSArIFBleHRfe2dhc30gKiBFeHBvX3tnYXN9KSogVENDJCQNCg0KRG9uZGU6DQoNCiogJFZCUF97Q0NOTn0kID0gVmFsb3IgQnJ1dG8gZGUgbGEgUHJvZHVjY2nDs24gdG90YWwsICBlc3RpbWFjacOzbiBwcm9waWEgY29uIGNyaXRlcmlvIGRlIGxhcyBDQ05ODQoqICRQaW50X3twZXRyw7NsZW99JCA9IFByZWNpbyBtZXJjYWRvIGludGVybm8gZGVsIHBldHLDs2xlbyBjcnVkbw0KKiAkUGludF97Z2FzfSQgPSBQcmVjaW8gbWVyY2FkbyBpbnRlcm5vIGRlbCBnYXMgbmF0dXJhbA0KKiAkUU1JbnRfe3BldHLDs2xlb30kID0gY2FudGlkYWRlcyB2ZW5kaWRhcyBhbCBtZXJjYWRvIGludGVybm8gZGUgcGV0csOzbGVvIGNydWRvDQoqICRRTUludF97Z2FzfSQgPSBjYW50aWRhZGVzIHZlbmRpZGFzIGFsIG1lcmNhZG8gaW50ZXJubyBkZWwgZ2FzIG5hdHVyYWwNCiogJEV4cG9fe3BldHLDs2xlb30kID0gZXhwb3J0YWNpb25lcyBkZSBwZXRyw7NsZW8gY3J1ZG8NCiogJEV4cG9fe2dhc30kID0gZXhwb3J0YWNpb25lcyBkZSBnYXMgbmF0dXJhbA0KKiAkVENDJCA9IFRpcG8gZGUgQ2FtYmlvIENvbWVyY2lhbA0KDQoNCjxicj4NCg0KVmFsb3IgQnJ1dG8gZGUgUHJvZHVjY2nDs24gZXh0cmFjY2nDs24sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQoNCiQkVkJQXF9leHRyX3tDQ05OfSA9IFZCUF97Q0NOTn0gKiAoMS1wcm9wXF9zZXJ2aWNpb3MpJCQNCg0KRG9uZGU6DQoNCiogJFZCUFxfZXh0cl97Q0NOTn0kID0gVmFsb3IgQnJ1dG8gZGUgbGEgUHJvZHVjY2nDs24gZXh0cmFjY2nDs24sICBlc3RpbWFjacOzbiBwcm9waWEgY29uIGNyaXRlcmlvIGRlIGxhcyBDQ05ODQoqICRwcm9wXF9leHRyJCA9IHByb3BvcmNpw7NuIGRlbCBWQlAgZGUgc2VydmljaW9zIGRlIGFwb3lvIHNvYnJlIFZCUCBkZSBleHRyYWNjacOzbiBkZSBwZXRyw7NsZW8geSBnYXMNCg0KDQpQcm9wb3JjacOzbiBkZSBsb3Mgc2VydmljaW9zIGRlIGFwb3lvIHNvYnJlIGxhIGV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyB5IGdhcw0KPGJyPg0KJCRwcm9wXF9zZXJ2aWNpb3MgPSBcZnJhY3tWQlBcX3NlcnZpY2lvc197Q09VfX17VkJQXF9leHRyX3tDT1V9ICsgVkJQXF9zZXJ2aWNpb3Nfe0NPVX19JCQNCg0KRG9uZGU6DQoNCiogJFZCUFxfc2VydmljaW9zX3tDT1V9JCA9IFZCUCBkZSBzZXJ2aWNpb3MgZGUgYXBveW8gZGVsIEN1YWRybyBkZSBVdGlsaXphY2nDs24gZGUgT2ZlcnRhDQoqICRWQlBcX2V4dHJhY2Npw7NuX3tDT1V9JCA9IFZCUCBkZSBleHRyYWNjacOzbiBkZSBwZXRyw7NsZW8geSBnYXMgZGVsIEN1YWRybyBkZSBVdGlsaXphY2nDs24gZGUgT2ZlcnRhDQoNCg0KDQo8YnI+DQpDb25zdW1vIEludGVybWVkaW8sIHZhbG9yZXMgb2ZpY2lhbGVzIGRlIGxhcyBDQ05ODQokJCBDSV97Q0NOTn0gPSBWQlBfe0NDTk59IC0gIFZBX3tDQ05OfSAkJA0KDQpEb25kZToNCg0KKiAkQ0lfe0NDTk59JCA9IENvbnN1bW8gSW50ZXJtZWRpbyB0b3RhbCwgZXN0aW1hY2nDs24gcHJvcGlhDQoqICRWQV97Q0NOTn0kID0gVmFsb3IgQWdyZWdhZG8sIGVzdGltYWNpw7NuIGRlIGxhcyBDQ05OIA0KDQo8YnI+DQpDb25zdW1vIEludGVybWVkaW8sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQokJCBDSV97Q0NOTn0gPSBWQlBfe0NDTk59ICogIENvZWZcX3RlYyAkJA0KRG9uZGU6DQoNCiogJENvZWZcX3RlYyQgPSBDb2VmaWNpZW50ZSB0w6ljbmljbyBkZSBNYXRyaXogSW5zdW1vIFByb2R1Y3RvDQoNCjxicj4NCkNvbnN1bW8gSW50ZXJtZWRpbyBkZSBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCg0KJCQgQ0lcX2V4dHJfe0NDTk59ID0gVkJQXF9leHRyX3tDQ05OfSAqICBDb2VmXF90ZWMgJCQNCg0KRG9uZGU6DQoNCiogJCBDSVxfZXh0cl97Q0NOTn0kID0gQ29uc3VtbyBJbnRlcm1lZGlvIGRlIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjcml0ZXJpbyBDQ05ODQoNCjxicj4NCk1hc2EgU2FsYXJpYWwsIHZhbG9yZXMgb2ZpY2lhbGVzIGRlIGxhcyBDQ05ODQokJE1TID0gVyAqIEVtcCAqIDEzJCQNCkRvbmRlOiANCg0KKiAkTVMkID0gTWFzYSBTYWxhcmlhbCANCiogJFckID0gIFNhbGFyaW8gYW51YWwgcHJvbWVkaW8NCiogJEVtcCQgPSBFbXBsZW8NCg0KPGJyPg0KTWFzYSBTYWxhcmlhbCwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCiQkTVMgPSAgVkJQX3tDQ05OfSAqICBDb2VmXF9NUyQkDQoNCkRvbmRlOiANCg0KKiAkQ29lZlxfTVMkID0gQ29lZmljaWVudGUgZGUgbGEgcHJvcG9yY2nDs24gZGUgTVMgc29icmUgVkJQDQoNCjxicj4NCk1hc2EgU2FsYXJpYWwgZGUgZXh0cmFjY2nDs24sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQokJE1TXF9leHRyID0gIFZCUFxfZXh0cl97Q0NOTn0gKiAgQ29lZlxfTVMkJA0KDQpEb25kZTogDQoNCiAgKiAkTVNcX2V4dHIkID0gTWFzYSBzYWxhcmlhbCBkZWwgc2VjdG9yIGV4dHJhY2Npw7NuDQoNCjxicj4NClZhbG9yIGFncmVnYWRvLCBlc3RpbWFjacOzbiBjcml0ZXJpbyBDQ05ODQokJFZBX3tDQ05OfSAgPSBWQlBfe0NDTk59IOKAkyBDSV97Q0NOTn0gJCQNCkRvbmRlOg0KDQoqICRWQV97Q0NOTn0kID0gVmFsb3IgQWdyZWdhZG8sIGVzdGltYWNpw7NuIHByb3BpYSBjb24gY3JpdGVyaW8gQ0NOTg0KDQo8YnI+DQpWYWxvciBhZ3JlZ2FkbyBkZSBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCiQkVkFcX2V4dHJfe0NDTk59ICA9IFZCUFxfZXh0cl97Q0NOTn0g4oCTIENJXF9leHRyX3tDQ05OfSAkJA0KDQpEb25kZToNCg0KKiAkVkFcX2V4dHJfe0NDTk59JCA9IFZhbG9yIEFncmVnYWRvIGRlIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBwcm9waWEgY29uIGNyaXRlcmlvIENDTk4gDQoNCg0KPGJyPg0KVmFsb3IgYWdyZWdhZG8sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBwcm9waW8NCiQkVkFfe3Byb3BpYX0gID0gVkJQX3twcm9waWF9IOKAkyBDSVxfZXh0cl97Q0NOTn0gJCQNCg0KRG9uZGU6DQoNCiogJFZBX3twcm9waWF9JCA9IFZhbG9yIEFncmVnYWRvLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gcHJvcGlvIA0KDQoNCjxicj4NCg0KRXhjZWRlbnRlIEJydXRvIGRlIEV4cGxvdGFjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCiQkRUJFX3tDQ05OfSAgPSBWQV97Q0NOTn0g4oCTIE1TICAgJCQNCjxicj4NCg0KRXhjZWRlbnRlIEJydXRvIGRlIEV4cGxvdGFjacOzbiBkZSBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCiQkRUJFXF9leHRyX3tDQ05OfSAgPSBWQVxfZXh0cl97Q0NOTn0g4oCTIE1TXF9leHRyICAgJCQNCg0KPGJyPg0KDQpFeGNlZGVudGUgQnJ1dG8gZGUgRXhwbG90YWNpw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gcHJvcGlvDQokJEVCRV97cHJvcGlhfSAgPSBWQV97cHJvcGlhfSDigJMgTVNcX2V4dHIgICAkJA0KDQoNCkRvbmRlOg0KDQoqICRFQkUkID0gRXhjZWRlbnRlIEJydXRvIGRlIEV4cGxvdGFjacOzbg0KKiAkQ0lcX2V4dHJfe0NDTk59JCA9IENvbnN1bW8gaW50ZXJtZWRpbyBkZWwgc2VjdG9yIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KDQoNCjxicj4NCkNvbnN1bW8gZGUgQ2FwaXRhbCBGaWpvLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gcHJvcGlvDQokJENvbktmaWpvID0gUFB5RSAqICBwcm9tKFxmcmFje0RlcH17UFB5RX0pICQkDQoNCkRvbmRlOiANCg0KKiAkQ29uS2Zpam8kID0gQ29uc3VtbyBkZSBDYXBpdGFsIEZpam8NCiogJFBQeUUkPSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyBuZXRhDQoqICRwcm9tKFxmcmFje0RlcH17UFB5RX0pICQgPSAgdGFzYSBkZSBkZXByZWNpYWNpw7NuIHByb21lZGlvDQoqICREZXAkID0gRGVwcmVjaWFjaW9uZXMgKGN1ZW50YSBnYXN0b3MgcG9yIG5hdHVyYWxlemEpDQoNCjxicj4NCg0KUGx1c3ZhbMOtYSAoRXhjZWRlbnRlIE5ldG8gZGUgRXhwbG90YWNpw7NuKSwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIHByb3Bpbw0KJCRQVl97cHJvcGlhfSA9IFZBX3twcm9waWF9IC0gQ29uS2Zpam8gLSBJbXAgJCQNCg0KDQpEb25kZToNCg0KKiAkUFZfe3Byb3BpYX0kID0gUGx1c3ZhbMOtYSAoKkV4Y2VkZW50ZSBOZXRvIGRlIEV4cGxvdGFjacOzbiopDQoqICRJbXAkID0gSW1wdWVzdG9zIG5vcm1hbGVzDQoNCg0KDQojIyBGdWVudGVzIHBhcmEgbGEgY29uc3RydWNjacOzbiBkZSBzZXJpZXMgDQoNCiogUHJvZHVjY2nDs24gZGUgQ3J1ZG86IA0KICArIDE5MTEgYSAxOTkyOiBBbnVhcmlvIGRlIGNvbWJ1c3RpYmxlcyANCiAgKyAxOTkzIC0gYWN0dWFsaWRhZDogU0VTQ08gRG93bnN0cmVhbQ0KICANCiogRXhwb3J0YWNpb25lcyBkZSBDcnVkbzogDQogICsgMTk2MiBhIDE5OTM6IFVOIENvbXRyYWRlIChjbGFzaWZpY2FjacOzbiBTSVRDIGFzIHJlcG9ydGVkKQ0KICArIDE5OTQgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCiAgKyBMb3MgZGF0b3MgZmFsdGFudGVzIGRlIFNFU0NPIHNlIGNvbXBsZXRhcm9uIGNvbiBNRUNPTg0KICArIFNpZ3VlbiBoYWJpZW5kbyBkYXRvcyBmYWx0YW50ZXMgcGFyYSBsb3MgYcOxb3MgMTk2NSwgMTk3MC03NCwgMTk3Ni03OCwgMTk4MC04NA0KICANCiogUHJlY2lvIE1lcmNhZG8gSW50ZXJubyBkZSBDcnVkbzogDQogICsgMTk2MyBhIDE5NjU6IEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRSBhanVzdGFkbyBjb24gZWwgw61uZGljZSBkZWwgcHJlY2lvIGRlbCBBbnVhcmlvIGRlIFlQRiANCiAgKyAxOTg5IGEgMTk5MTogQW51YXJpbyBkZSBZUEYNCiAgKyAxOTY2IGEgMTk4ODogS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFDQogICsgMTk5MjogTUVDT04gYWp1c3RhZG8gY29uIGxhIHZhcmlhY2nDs24gZGVsIMONbmRpY2UgZGUgcHJlY2lvcyBpbnRlcm5vcyBhbCBwb3IgbWF5b3IgKElQSU0pDQogICsgMTk5MyBlbiBhZGVsYW50ZTogTUVDT04gDQogIA0KKiBQcmVjaW8gTWVyY2FkbyBFeHRlcm5vIENydWRvOg0KICArIGVudHJlIDE5NjIgeSAxOTkyOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBVTiBDb210cmFkZQ0KICArIGVudHJlIDE5OTMtMjAwMSB5IDIwMDQtMjAxNDogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgTWVjb24NCiAgKyBlbnRyZSAyMDAyIHkgMjAwMzogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBkZSBBcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUgKENsYXNpZmljYWNpw7NuIEhTIGFzIHJlcG9ydGVkKSAgDQogICsgMjAxNCBlbiBhZGVsYW50ZTogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgKFJlZ2Fsw61hcykNCiAgKyBWYWxvcmVzIGZhbHRhbnRlcyBwcmV2aW9zIGEgMTk5MjogQnJlbnQgIChGdWVudGU6IEluZmxhdGlvbiBEYXRhKQ0KICANCiogUHJvZHVjY2nDs24gZGUgR2FzOg0KICArIDE5MTEgYSAxOTkyOiBBbnVhcmlvIGRlIGNvbWJ1c3RpYmxlcyANCiAgKyAxOTkzIGVuIGFkZWxhbnRlOiBTRVNDTyBEb3duc3RyZWFtDQogIA0KKiBFeHBvcnRhY2lvbmVzIGRlIGdhczogDQogICsgMTk2MiBhIDE5OTY6IFVOIENvbXRyYWRlLA0KICArIDE5OTcgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCiAgKyBEYXRvcyBmYWx0YW50ZXMgcGFyYSBsb3MgYcOxb3MgMTk5OSB5IDIwMDANCiAgDQoqIFByZWNpbyBNZXJjYWRvIEludGVybm8gZGUgZ2FzOg0KICArIDE5NjMgLSAxOTY5ICYgMTk4OSAtIDE5OTI6IEFudWFyaW8gZGUgWVBGDQogICsgMTk3MCAtIDE5ODg6ICBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUNCiAgKyAxOTkzIGVuIGFkZWxhbnRlOiBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAtIEJhc2UgUmVnYWzDrWFzDQogICsgRWwgZGF0byBkZWwgYcOxbyAxOTkyIHNlIGRpdmlkacOzIHBvciAxMCwgZGFkbyBxdWUgcmVzdWx0YWJhIGV4Y2VzaXZhbWVudGUgYWx0bywgbG8gY3VhbCBlcyBtZXRvZG9sw7NnaWNhbWVudGUgaW5hY2VwdGFibGUgcGVybyBzaXJ2ZSBkZSBlamVyY2ljaW8uIA0KICANCiogUHJlY2lvIE1lcmNhZG8gRXh0ZXJubzoNCiAgKyBBw7FvcyAxOTY0IHkgMTk2NTogUHJlY2lvIGRlIGltcG9ydGFjacOzbiBkZSBnYXMgcHJvdmVuaWVudGUgZGUgQm9saXZpYSBoYWNpYSBBcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUNCiAgKyAxOTY2IGVuIGFkZWxhbnRlOiBQcmVjaW8gZGUgZXhwb3J0YWNpb24gZGUgZ2FzIGRlc2RlIEJvbGl2aWEgYSBBcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUNCiAgKyBEYXRvcyBmYWx0YW50ZXMgcGFyYSBsb3MgYcOxb3MgcHJldmlvcyBhIDE5NjMgeSBwZXLDrW9kbyAxOTY4LTE5NzEgDQoNCiogVmFsb3IgQnJ1dG8gZGUgbGEgUHJvZHVjY2nDs24sIFZhbG9yIEFncmVnYWRvIHkgQ29uc3VtbyBJbnRlcm1lZGlvOg0KICArIElOREVDIC0gRGlyZWNjacOzbiBOYWNpb25hbCBkZSBDdWVudGFzIE5hY2lvbmFsZXMgKEJhc2UgTWluZXLDrWEgZSBIaWRyb2NhcmJ1cm9zIGRlIGxhcyBDdWVudGFzIE5hY2lvbmFsZXMpLiBMYXMgdmFyaWFibGVzICJleHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MiIHJlZmllcmVuIGEgIkV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbyB5IGdhcyBuYXR1cmFsLiBBY3RpdmlkYWRlcyBkZSBzZXJ2aWNpb3MgcmVsYWNpb25hZGFzIGNvbiBsYSBleHRyYWNjacOzbiBkZSBwZXRyw7NsZW8geSBnYXMsIGV4Y2VwdG8gbGFzIGFjdGl2aWRhZGVzIGRlIHByb3NwZWNjacOzbiINCiAgKyBDw6FsY3VsbyBwcm9waW8gZGVsIFZCUCBjb24gZGF0b3MgZGF0b3MgZGUgcHJvZHVjY2nDs24geSBwcmVjaW8gaW50ZXJuYWNpb25hbCByZWNvcGlsYWRvcy4gTGFzIGZ1ZW50ZXMgc29uIGxhcyBzaWd1aWVudGVzIChsb3MgY3JpdGVyaW9zIHNvbiBsb3MgbWlzbW9zIHBhcmEgbGEgdXRpbGl6YWNpw7NuIHBvc3RlcmlvciBlbiBlbCBjw6FsY3VsbyBkZSByZW50YSBkZSBsYSB0aWVycmEgaGlkcm9jYXJidXLDrWZlcmEgcG9yIGRpZmVyZW5jaWFsIGRlIHByZWNpb3MsIHNvYnJldmFsdWFjacOzbiBjYW1iaWFyaWEgeSBvdHJvcyBtZWNhbmlzbW9zKQ0KDQoqIFNhbGFyaW8geSBlbXBsZW8NCiAgKyAxOTYwLTE5OTY6IGVzdGltYWNpw7NuIGEgcGFydGlyIGRlIGFwbGljYWNpw7NuIGRlbCBjb2VmaWNpZW50ZSBkZSBwcm9wb3JjacOzbiBkZSBsYSBtYXNhIHNhbGFyaWFsIHNvYnJlIGVsIFZCUA0KICArIDE5OTYgZW4gYWRlbGFudGU6IE1pbmlzdGVyaW8gZGUgVHJhYmFqbywgRW1wbGVvIHkgU2VndXJpZGFkIFNvY2lhbCAtIE9ic2VydmF0b3JpbyBkZSBFbXBsZW8geSBEaW7DoW1pY2EgRW1wcmVzYXJpYWwgKE9FREUpDQoNCiogQ29uc3VtbyBkZSBjYXBpdGFsIGZpam8NCiAgKyBDb2VmaWNpZW50ZSBkZSBkZXByZWNpYWNpw7NuIGVzdGltYWRvIGEgcGFydGlyIGRlIEVzdGFkb3MgQ29udGFibGVzIGRlIFlQRiAoMTk5OC0yMDE4KQ0KPGJyPg0KDQoNCg0KIyMjIEN1ZW50YXMgTmFjaW9uYWxlcw0KDQpbUHJvZHVjdG8gSW50ZXJubyBCcnV0byBFeHBsb3RhY2nDs24gTWluYXMgeSBDYW50ZXJhcyBNaWxsb25lcyBkZSBwZXNvcyBjb25zdGFudGVzLiBCYXNlIDE5NjAuIFZhbG9yZXMgdHJpbWVzdHJhbGVzDQpQSUIgRXhwbG90YWNpw7NuIE1pbmFzIHkgQ2FudGVyYXMgZW4gbWlsbG9uZXMgZGUgcGVzb3MgZGUgMTk2MC4gMTk3MC0xOTgwXShodHRwczovL2RhdG9zLmdvYi5hci9kYXRhc2V0L3NzcG0tcHJvZHVjdG8taW50ZXJuby1icnV0by1zZWN0b3JpYWwtMTk3MC0xOTgwKQ0KDQoNCltQcm9kdWN0byBJbnRlcm5vIEJydXRvIEV4cGxvdGFjacOzbiBNaW5hcyB5IENhbnRlcmFzLCBBdXN0cmFsZXMgY29uc3RhbnRlcy4gQmFzZSAxOTcwLlZhbG9yZXMgdHJpbWVzdHJhbGVzDQpQSUIgRXhwbG90YWNpw7NuIE1pbmFzIHkgQ2FudGVyYXMgZW4gYXVzdHJhbGVzIGEgcHJlY2lvcyBkZSAxOTcwLiAxOTgwLTE5OTBdKGh0dHBzOi8vZGF0b3MuZ29iLmFyL2RhdGFzZXQvc3NwbS1wcm9kdWN0by1pbnRlcm5vLWJydXRvLXNlY3RvcmlhbC0xOTgwLTE5OTApIA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI01JUCA5Nw0KIyBjb2VmaWNpZW50ZXMgZGUgcmVxdWVyaW1pZW50b3MgZGlyZWN0b3MNCg0KbWlwXzk3IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL01JUC9taXBfbWF0cml6MTIueGxzIiwgDQogICAgc2tpcCA9IDcpICU+JSANCiAgc2VsZWN0KC0iLi4uMSIpICU+JSANCiAgcmVuYW1lKGFjdGl2aWRhZCA9ICIuLi4yIikNCiAgIyBmaWx0ZXIoIi4uLjIiICVpbiUgYyggIlVzb3MgZGUgbGEgcHJvZHVjY2nDs24gbmFjaW9uYWwgYSBwcmVjaW9zIGLDoXNpY29zIiwgICJWYWxvciBicnV0byBkZSBsYSBwcm9kdWNjacOzbiBhIHByZWNpb3MgYsOhc2ljb3MiICkpDQoNCmNpX2V4dHJhY2Npb24gPC0gbWlwXzk3W2MoMTI2LDE0OSksIGMoImFjdGl2aWRhZCIgLCAiRXh0cmFjY2nDs24gZGUgcGV0csOzbGVvLCBnYXMsIGNhcmLDs24geSB1cmFuaW8iKV0NCg0KY29lZl90ZWNuaWNvXzk3IDwtIGNpX2V4dHJhY2Npb25bMSwyXS9jaV9leHRyYWNjaW9uWzIsMl0NCg0KeCA8LSBtaXBfOTdbYygxNDAsIDE0OSksXSAjJT4lIA0KICAgIyBnYXRoZXIoa2V5ID0gc2VjdG9yLCB2YWx1ZSA9IHZhbG9yLCAyOm5jb2woLikpICU+JSANCg0KaW1wX3Byb21fOTcgPC0gYXBwbHkoWCA9IHhbMSwyOm5jb2woeCldL3hbMiwyOm5jb2woeCldICwgTUFSR0lOID0gMSAsIEZVTiA9IGZ1bmN0aW9uKHgpIG1lYW4oeCwgbmEucm09VCkgICkNCiAgICANCg0KIyBjb2VmIENVTyAyMDA0IGEgcGFydGlyIGRlIENJL1ZCUA0KIyBjb2VmX3RlY25pY28gPC0gIDAuMzY5MTA0MzAyDQoNCg0KI1Blc28gZGUgbG9zIHNlcnZpY2lvcw0KI0NVTyANCiNsYSBzdW1hIGRlIGxhcyBjb2x1bW5hcyBub3MgZGEgZWwgVkJQDQpDT1UgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvTUlQL3NoX2NvdV8wNl8xNi54bHMiLCANCiAgICBza2lwID0gMikgJT4lDQogIHJlbmFtZShwcm9kdWN0byA9ICIuLi4xIiwNCiAgICAgICAgIGNwYyA9ICIuLi4yIikgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChwcm9kdWN0bywgIlxcZCIpICYgIShzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiXk4iKSkpICU+JQ0KICBncm91cF9ieShwcm9kdWN0bykgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0Kc2VydmljaW9fc19leHRyYWNjaW9uIDwtICBzdW0oQ09VWzEyXSkvKCBzdW0oQ09VWzExXSkgKyBzdW0oQ09VWzEyXSkgKQ0KbnJvdyhDT1UpDQoNCg0KIyBEZXByZWNpYWNpw7NuIGRlbCBzdG9jaw0KY29uc3Vtb19rX2Zpam9feXBmIDwtIChyZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JQ0KICBmaWx0ZXIoZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICBncm91cF9ieShlbXByZXNhKSAlPiUgDQogIG11dGF0ZSh0YXNhX2RlcHJlY2lhY2lvbiA9IGRlcHJlY2lhY2lvbmVzL3BweWUpICU+JSANCiAgc3VtbWFyaXNlKHRhc2FfZGVwcmVjaWFjaW9uID0gbWVhbihkZXByZWNpYWNpb25lcy9wcHllKSkpJHRhc2FfZGVwcmVjaWFjaW9uDQoNCnZhcigocmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy9iYWxhbmNlc19hcmcuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUNCiAgZmlsdGVyKGVtcHJlc2EgPT0gIllQRiIpICU+JSANCiAgZ3JvdXBfYnkoZmVjaGEpICU+JQ0KICBzdW1tYXJpc2UodGFzYV9kZXByZWNpYWNpb24gPSBtZWFuKGRlcHJlY2lhY2lvbmVzL3BweWUpKSkkdGFzYV9kZXByZWNpYWNpb24pDQoNCg0KDQpgYGANCg0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNDQ05OIChkYXRvcyBvZmljaWFsZXMpDQojIyBCYXNlIG1pbmVyw61hDQpjY25uX29maWNpYWwgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9iYXNlLW1pbmVyaWEtZS1oaWRyb2NhcmJ1cm9zIGN1ZW50YXMgbmFjaW9uYWxlcy54bHMiLCBzaGVldCA9ICJDdWVudGFzIE5hY2lvbmFsZXMiLCBza2lwID0gNSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgIHBlcmlvZG8gPSJQZXLDrW9kbyIsDQogICAgICAgIHZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgPSAgIi4uLjUiLA0KICAgICAgICB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgPSAgIi4uLjE1IikgJT4lIA0KICBmaWx0ZXIoaXMubmEocGVyaW9kbyksICFpcy5uYShhbmlvKSApICU+JSAgI2ZpbHRyYW1vcyBsb3MgZGF0b3MgYW51YWxlcw0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIHBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcz0gYXMuZG91YmxlKHZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MpLA0KICAgICAgICAgdmFfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zPSBhcy5kb3VibGUodmFfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zKSwNCiAgICAgICAgIHZicF9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgPSB2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zICogKDEgLSBzZXJ2aWNpb19zX2V4dHJhY2Npb24pLA0KICAgICAgICAgdmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gdmFfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zICogKDEgLSBzZXJ2aWNpb19zX2V4dHJhY2Npb24pLA0KICAgICAgICAgY2lfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zPQ0KICAgICAgICAgICB2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zLXZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcywNCiAgICAgICAgIGNpX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyA9IHZicF9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgLSB2YV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwNCiAgICAgICAgIHZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgLCANCiAgICAgICAgIHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcywNCiAgICAgICAgIGNpX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcywNCiAgICAgICAgIHZicF9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgLCANCiAgICAgICAgIHZhX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcywNCiAgICAgICAgIGNpX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcykgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JQ0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHt4LzEwXjN9KSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIikgJT4lIA0KICBsZWZ0X2pvaW4obWFzYV9zYWxhcmlhbF9oaWRyb2NhcmJ1cm9zICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICB1bmlkYWQsDQogICAgICAgICAgICAgICAgICAgICBtc190b3QgPSBtYXNhX3NhbGFyaWFsX3RvdGFsX29lZGUsDQogICAgICAgICAgICAgICAgICAgICBtc19leHRyID1tYXNhX3NhbGFyaWFsX2V4dHJhY2Npb25fb2VkZSApLCBieSA9IGMoImFuaW8iLCAidW5pZGFkIikpICU+JSANCiAgbXV0YXRlKGViZV90b3QgPSB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgLSBtc190b3QsDQogICAgICAgICBlYmVfZXh0ciA9IHZhX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyAtbXNfZXh0ciwNCiAgICAgICAgIGZ1ZW50ZSA9ICJDQ05OIG9maWNpYWwiICkgJT4lIA0KICByZW5hbWUodmJwX2V4dHIgPSB2YnBfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgY2lfZXh0ciA9IGNpX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcywNCiAgICAgICAgIHZhX2V4dHIgPXZhX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcywNCiAgICAgICAgIHZicF90b3Q9IHZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgLCANCiAgICAgICAgIHZhX3RvdD0gdmFfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgY2lfdG90ID0gY2lfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zKSAlPiUgDQogIHVuZ3JvdXAoKQ0KY2Nubl9vZmljaWFsDQoNCm1lYW5fY29lZl9tcyA8LSAgY2Nubl9vZmljaWFsICU+JSANCiAgc3VtbWFyaXNlKGNvZWZfbXNfdG90ID0gbWVhbihtc190b3QvdmJwX3RvdCxuYS5ybT0gVCksDQogICAgICAgICAgICAgIGNvZWZfbXNfZXh0cj0gbWVhbihtc19leHRyL3ZicF9leHRyICxuYS5ybT0gVCkpDQoNCm1lZGlhbl9jb2VmX21zIDwtICBjY25uX29maWNpYWwgJT4lIA0KICBzdW1tYXJpc2UoY29lZl9tc190b3QgPSBtZWRpYW4obXNfdG90L3ZicF90b3QsbmEucm09IFQpLA0KICAgICAgICAgICAgICBjb2VmX21zX2V4dHI9IG1lZGlhbihtc19leHRyL3ZicF9leHRyICxuYS5ybT0gVCkpDQoNCiMgIyBlc3RpbWFjaW9uIHByb3BpYSBjb2VmIHRlY25pY28NCiMgY2Nubl9vZmljaWFsICU+JSANCiMgICBzdW1tYXJpc2UoY29lZl9yZXFfZXh0cl95X3NlcnYgPW1lYW4oY2lfZXh0cl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zL3ZicF9leHRyX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsIG5hLnJtPVQpLA0KIyAgICAgICAgICBjb2VmX3JlcV9leHRyID0gbWVhbihjaV9leHRyX2hpZHJvY2FyYnVyb3MvdmJwX2V4dHJfaGlkcm9jYXJidXJvcywgbmEucm09VCkpDQoNCg0KIyBCYXNlIElOREVDDQp4IDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvaW5kZWMvc2hfVkJQX1ZBQl8wM18yMS54bHMiLCBzaGVldCA9IDMsIHNraXAgPSAzKSAlPiUgDQogIG5hLm9taXQoKSANCm5hbWVzKHgpIDwtYygic2VjdG9yIiwgMjAwNDoyMDIwKQ0KdmJwX2Njbm4gPC0geCAlPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLHZhbHVlID0gdmJwX3RvdCAsIDI6bmNvbCguKSkNCg0KeSA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL2luZGVjL3NoX1ZCUF9WQUJfMDNfMjEueGxzIiwgc2hlZXQgPSA1LCBza2lwID0gNCkgJT4lIA0KICBzZWxlY3QoMSwgY29udGFpbnMoIlRvdGFsIikpICU+JSANCiAgbmEub21pdCgpIA0KbmFtZXMoeSkgPC1jKCJzZWN0b3IiLCAyMDA0OjIwMjApDQp2YV9jY25uIDwtIHkgJT4lIA0KICBnYXRoZXIoa2V5ID0gYW5pbyx2YWx1ZSA9IHZhX3RvdCAsIDI6bmNvbCguKSkNCg0KY2Nubl9vZmljaWFsIDwtIHZhX2Njbm4gJT4lIA0KICBmaWx0ZXIoZ3JlcGwoIkV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyIsIHNlY3RvcikpICU+JSANCiAgaW5uZXJfam9pbih2YnBfY2NubiAlPiUgZmlsdGVyKGdyZXBsKCJFeHRyYWNjacOzbiBkZSBwZXRyw7NsZW8iLCBzZWN0b3IpKSwgYnkgPSBjKCJzZWN0b3IiLCAiYW5pbyIpKSAlPiUgDQogIG11dGF0ZShhbmlvID0gYXMuZG91YmxlKGFuaW8pKSAlPiUgDQogIGxlZnRfam9pbihtYXNhX3NhbGFyaWFsX2hpZHJvY2FyYnVyb3MgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHVuaWRhZCwNCiAgICAgICAgICAgICAgICAgICAgIG1zX3RvdCA9IG1hc2Ffc2FsYXJpYWxfdG90YWxfb2VkZSwNCiAgICAgICAgICAgICAgICAgICAgIG1zX2V4dHIgPW1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbl9vZWRlICksIGJ5ID0gYygiYW5pbyIpKSAlPiUgDQogIG11dGF0ZSh2YnBfZXh0ciA9IHZicF90b3QqICgxIC0gc2VydmljaW9fc19leHRyYWNjaW9uKSwNCiAgICAgICAgIHZhX2V4dHIgPSB2YV90b3QqICgxIC0gc2VydmljaW9fc19leHRyYWNjaW9uKSwNCiAgICAgICAgIGNpX3RvdCA9IHZicF90b3QgLSB2YV90b3QsDQogICAgICAgICBjaV9leHRyID0gdmJwX2V4dHIgIC0gdmFfZXh0ciwNCiAgICAgICAgIGViZV90b3QgPXZhX3RvdC1tc190b3QsDQogICAgICAgICBlYmVfZXh0ciA9IHZhX2V4dHIgLW1zX2V4dHIsDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICAgZnVlbnRlID0gIkNDTk4gb2ZpY2lhbCIgKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGZ1ZW50ZSwgZXZlcnl0aGluZyguKSwgLXNlY3RvcikNCg0KIyMgVkEgeSBWQlAgcHJlY2lvcyA5Mw0KeCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9yZXBvcy9oaWRyb2NhcmJ1cm9zL2FuYWxpc2lzL2RhdGEvbWVjb24vUEJJX0Jhc2UgMTk5M19QTS54bHN4IiwgDQogICAgc2hlZXQgPSAiVkJQIGMiLCBjb2xfdHlwZXMgPSBjKCJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIpLCBza2lwID0gNikgJT4lIA0KICAgIHNlbGVjdCgxLCAhY29udGFpbnMoIkkiKSkNCm5hbWVzKHgpIDwtIGMoInNlY3RvciIsIDE5OTM6MjAwOSkNCnZicF85MyA8LSB4ICU+JSANCiAgZ2F0aGVyKGtleSA9IGFuaW8sdmFsdWUgPSB2YnBfdG90ICwgMjpuY29sKC4pKQ0KDQp5IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL3JlcG9zL2hpZHJvY2FyYnVyb3MvYW5hbGlzaXMvZGF0YS9tZWNvbi9QQklfQmFzZSAxOTkzX1BNLnhsc3giLCANCiAgICBzaGVldCA9ICJWQUIgYyIsIHNraXAgPSA2KSAlPiUgDQogICAgc2VsZWN0KDEsICFjb250YWlucygiSSIpKQ0KbmFtZXMoeSkgPC0gYygic2VjdG9yIiwgMTk5MzoyMDA5KQ0KdmFfOTMgPC0geSAlPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLHZhbHVlID0gdmFfdG90ICwgMjpuY29sKC4pKQ0KDQp2YWxvcl9wcm9kdWNjaW9uXzkzIDwtIHZhXzkzICU+JSAgaW5uZXJfam9pbih2YnBfOTMpICU+JSANCiAgbXV0YXRlKGFuaW8gPSBhcy5kb3VibGUoYW5pbykpDQoNCmNvbnN1bW9faW50ZXJtZWRpb185MyA8LSB2YWxvcl9wcm9kdWNjaW9uXzkzICU+JSANCiAgZmlsdGVyKGdyZXBsKCJDIC0gRVhQTE9UQUNJT04gREUgTUlOQVMgWSBDQU5URVJBUyIsIHNlY3RvcikpICU+JSANCiAgbXV0YXRlKGNvZWZfdGVjXzkzID0gMS0odmFfdG90L3ZicF90b3QpLCANCiAgICAgICAgICAgY29lZl90ZWNfOTNfaW5kZXggPSBnZW5lcmFyX2luZGljZShjb2VmX3RlY185MywgZmVjaGEgPSBhbmlvLCBmZWNoYV9iYXNlID0gMjAwNCkpDQogIA0KIyMgU2VyaWUgZGUgQ0kNCiMgPCAxOTk3IDogTUlQIDk3DQojIDk3IGEgMjAwNCA6IHByb2dyZXNpb24gZGUgbWlwOTcgYSBpbmRlYw0KIyAyMDA0IGEgMjAxOTogaW5kZWMNCmNvZWZfY29uc3Vtb19pbnRlcm1lZGlvIDwtIGRhdGEuZnJhbWUoYW5pbyA9IDE5NjA6MjAyMCkgJT4lDQogIGxlZnRfam9pbihjY25uX29maWNpYWwgJT4lICBzZWxlY3QoYW5pbywgdmJwX3RvdCwgdmFfdG90KSwgYnkgPSAiYW5pbyIpICU+JSANCiAgbGVmdF9qb2luKGNvbnN1bW9faW50ZXJtZWRpb185MyAlPiUgc2VsZWN0KGFuaW8sIGNvZWZfdGVjXzkzX2luZGV4KSkgJT4lIA0KICBtdXRhdGUoY29lZl9jaSA9IDEtKHZhX3RvdC92YnBfdG90KSkNCmNpX2Jhc2UgPSBjb2VmX2NvbnN1bW9faW50ZXJtZWRpbyRjb2VmX2NpW2NvZWZfY29uc3Vtb19pbnRlcm1lZGlvJGFuaW8gPT0yMDA0XQ0KDQpjb2VmX2NvbnN1bW9faW50ZXJtZWRpbyA8LSBjb2VmX2NvbnN1bW9faW50ZXJtZWRpbyAlPiUgDQogIG11dGF0ZShjb2VmX2NpID0gY2FzZV93aGVuKCBhbmlvIDw9IDIwMDQgfiBjb2VmX3RlY185M19pbmRleCAqIGNpX2Jhc2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gY29lZl9jaSkpICU+JSANCiAgICAgICAgICMgY29lZl9jaSA9IGltcHV0ZVRTOjpuYS5pbnRlcnBvbGF0aW9uKGNvZWZfY2ksIG9wdGlvbiA9ICJsaW5lYXIiICkpICU+JSANCiAgc2VsZWN0KGFuaW8sIGNvZWZfY2kpDQpjb2VmX2NvbnN1bW9faW50ZXJtZWRpbw0KYGBgDQoNCiMjIyBFc3RpbWFjaW9uZXMgcHJvcGlhcyANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiN2YXJpYWJsZXMgcGFyYSBsYSBlc3RpbWFjacOzbiANCnByZWNpb3NfeV9jYW50aWRhZGVzIDwtIHByb2RfbWVyZ2VfY3J1ZG8gJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfY3J1ZG8gPSB1bmlkYWQsIHByb2RfY3J1ZG8pICU+JQ0KICBsZWZ0X2pvaW4oZXhwb19xX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50X2NydWRvID11bmlkYWQsIGV4cG9fY3J1ZG8pKSAlPiUgDQogIGxlZnRfam9pbihleGlzdGVuY2lhc19wZXRyb2xlbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudF9jcnVkbyA9IHVuaWRhZCwgZXhpc3RlbmNpYXNfY3J1ZG8pKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChleGlzdGVuY2lhc19jcnVkbz0wICkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGV4cG9fY3J1ZG89MCApKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fbWlfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX3ByZWNpb19jcnVkbyA9IHVuaWRhZCwgcHJlY2lvX2NydWRvX21kb2ludCksIGJ5ID0gImFuaW8iKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZF9wcmVjaW9fY3J1ZG8gPSB1bmlkYWQsIHByZWNpb19tZV9jcnVkbyksIGJ5ID0gYygiYW5pbyIsICJ1bmlkYWRfcHJlY2lvX2NydWRvIikpICU+JSANCiAgbGVmdF9qb2luKHByb2RfbWVyZ2VfZ2FzX01NQlRVICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50X2dhcz0gdW5pZGFkLHByb2RfZ2FzKSwgYnkgPSAiYW5pbyIpICU+JQ0KICBsZWZ0X2pvaW4oZXhwb19xX2dhc19NTUJUVSAlPiUgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50X2dhcz0gdW5pZGFkLCBleHBvX2dhcykpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWRfcHJlY2lvX2dhcyA9IHVuaWRhZCwgcHJlY2lvX2V4dGVybm9fZ2FzLCBwcmVjaW9fZXhwb3J0YWNpb25fZ2FzX2FyKSwgYnkgPSAiYW5pbyIpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHByZWNpb19nYXNfbWRvaW50KSkgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdGNwLCB0Y2MpLCBieSA9ICJhbmlvIikNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb3NfeV9jYW50aWRhZGVzLCBwYXRoID0gInJlc3VsdGFkb3MvYXJnZW50aW5hL2luc3Vtb3NfY3JpdGVyaW9fY2Nubi54bHN4IikNCg0KIyMgQ3JpdGVyaW8gQ0NOTiANCmNyaXRlcmlvX2Njbm4gPC0gcHJlY2lvc195X2NhbnRpZGFkZXMgJT4lIA0KICBsZWZ0X2pvaW4oY29lZl9jb25zdW1vX2ludGVybWVkaW8sIGJ5ID0iYW5pbyIpICU+JSANCiAgbXV0YXRlKGNydWRvX21kb19pbnRlcm5vID0gcHJvZF9jcnVkbyAtIGV4cG9fY3J1ZG8sDQogICAgICAgICBleHBvX2dhcyA9IHJlcGxhY2VfbmEoZXhwb19nYXMsIDAgKSwNCiAgICAgICAgIGdhc19tZG9faW50ZXJubyA9IHByb2RfZ2FzIC0gZXhwb19nYXMsDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICANCiAgICAgICAgIyBjcml0ZXJpbyBDQ05ODQogICAgICAgICB2YnBfdG90ID0gKChjcnVkb19tZG9faW50ZXJubypwcmVjaW9fY3J1ZG9fbWRvaW50Kw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb19jcnVkbypwcmVjaW9fbWVfY3J1ZG8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdhc19tZG9faW50ZXJubyAqIHByZWNpb19nYXNfbWRvaW50IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtleHBvX2dhcypwcmVjaW9fZXhwb3J0YWNpb25fZ2FzX2FyICkqdGNjKS8xMF42LA0KICAgICAgICAgdmJwX2V4dHIgPXZicF90b3QqKDEtc2VydmljaW9fc19leHRyYWNjaW9uKSwNCiAgICAgICAgIGNpX3RvdCA9IHZicF90b3QgKmNvZWZfY2kgLA0KICAgICAgICAgY2lfZXh0ciA9IHZicF9leHRyICogY29lZl9jaSwNCiAgICAgICAgdmFfdG90PSAgIHZicF90b3QgLSBjaV90b3QsDQogICAgICAgIHZhX2V4dHI9ICAgdmJwX2V4dHIgLSBjaV9leHRyLA0KICAgICAgICBtc19leHRyID0gdmJwX2V4dHIgKiBtZWFuX2NvZWZfbXMkY29lZl9tc19leHRyLA0KICAgICAgICAgbXNfdG90ID0gdmJwX3RvdCAqIG1lYW5fY29lZl9tcyRjb2VmX21zX3RvdCwNCiAgICAgICAgIGViZV90b3QgPSB2YV90b3QgLSBtc190b3QsDQogICAgICAgICBlYmVfZXh0cj12YV9leHRyIC0gbXNfdG90ICAsDQogICAgICAgIGZ1ZW50ZSA9ICJDcml0ZXJpbyBDQ05OIikNCmNyaXRlcmlvX2Njbm4NCg0KDQojIEVtcGFsbWUgQ0NOTg0KaW5kaWNlX3ZicF9jcml0ZXJpb19jY25uIDwtIGNyaXRlcmlvX2Njbm4gJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUodmJwX2NyaXRlcmlvX2Njbm5fMDQgPSBnZW5lcmFyX2luZGljZSh2YnBfdG90LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYSA9IGFuaW8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDA0KSApICU+JSAjICwNCiAgICAgICAgICMgdmJwX2NyaXRlcmlvX2Njbm5fMTIgPSBnZW5lcmFyX2luZGljZSh2YnBfdG90LA0KICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhID0gYW5pbywNCiAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9iYXNlID0gMjAxMikpICU+JSANCiAgc2VsZWN0KGFuaW8sIHZicF9jcml0ZXJpb19jY25uXzA0KQ0KDQplbXBhbG1lX2Njbm4gPC0gY2Nubl9vZmljaWFsICU+JSANCiAgZnVsbF9qb2luKGNvZWZfY29uc3Vtb19pbnRlcm1lZGlvLCBieSA9ICJhbmlvIikgJT4lIA0KICBmdWxsX2pvaW4oaW5kaWNlX3ZicF9jcml0ZXJpb19jY25uLCBieSA9ICJhbmlvIikgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgbXV0YXRlKHZicF9leHRyID0gY2FzZV93aGVuKGFuaW8gPCAyMDA0IH4gY2Nubl9vZmljaWFsJHZicF9leHRyW2Njbm5fb2ZpY2lhbCRhbmlvID09IDIwMDRdICogdmJwX2NyaXRlcmlvX2Njbm5fMDQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdmJwX2V4dHIpICwNCiAgICB2YnBfdG90ID0gY2FzZV93aGVuKCBhbmlvIDwgMjAwNCB+IGNjbm5fb2ZpY2lhbCR2YnBfdG90W2Njbm5fb2ZpY2lhbCRhbmlvID09IDIwMDRdICogdmJwX2NyaXRlcmlvX2Njbm5fMDQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdmJwX3RvdCksDQogICAgY2lfZXh0ciA9IHZicF9leHRyICogY29lZl9jaSAsDQogICAgY2lfdG90ID0gdmJwX3RvdCAqY29lZl9jaSAgICwNCiAgICB2YV90b3QgPSBjYXNlX3doZW4oaXMubmEodmFfdG90KSB+IHZicF90b3QgLSBjaV90b3QgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdmFfdG90KSwNCiAgICB2YV9leHRyID0gY2FzZV93aGVuKGlzLm5hKHZhX2V4dHIpIH4gdmJwX2V4dHIgLSBjaV9leHRyICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHZhX2V4dHIpLA0KICAgIG1zX3RvdCA9IGNhc2Vfd2hlbihpcy5uYShtc190b3QpIH4gdmJwX3RvdCptZWFuX2NvZWZfbXMkY29lZl9tc190b3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBtc190b3QpICwNCiAgICBtc19leHRyID0gY2FzZV93aGVuKGlzLm5hKG1zX2V4dHIpIH4gdmJwX3RvdCptZWFuX2NvZWZfbXMkY29lZl9tc19leHRyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gbXNfZXh0ciksIA0KICAgIGViZV90b3QgPSBjYXNlX3doZW4oaXMubmEoZWJlX3RvdCkgfiB2YV90b3QgLW1zX3RvdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGViZV90b3QpLA0KICAgIGViZV9leHRyID0gY2FzZV93aGVuKGlzLm5hKGViZV9leHRyKSB+IHZhX2V4dHIgLW1zX2V4dHIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBlYmVfZXh0ciksDQogICAgZnVlbnRlID0gIkVtcGFsbWUgQ0NOTiIsDQogICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiKSAlPiUgDQogICBsZWZ0X2pvaW4oc3RvY2tfZXN0aW1hZG8gJT4lDQogICAgICAgICAgICAgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihmdWVudGVfcHB5ZSA9PSAiQm9sc2FyIikgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShjb25zdW1vX2tfZmlqbyA9IHZhbG9yICogaXBjXzE4ICogY29uc3Vtb19rX2Zpam9feXBmKSAlPiUgDQogICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgY29uc3Vtb19rX2Zpam8pKSAlPiUNCiAgbXV0YXRlKCBwdiA9IGViZV9leHRyIC0gY29uc3Vtb19rX2Zpam8gLSAodmJwX3RvdCAqIGltcF9wcm9tXzk3KSkNCiAgDQoNCiMjIENyaXRlcmlvIHByb3BpbyANCmNyaXRlcmlvX3Byb3BpbyA8LSBwcmVjaW9zX3lfY2FudGlkYWRlcyAlPiUNCiAgbGVmdF9qb2luKGVtcGFsbWVfY2NubiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLHVuaWRhZCwgY2lfdG90LCBjaV9leHRyLCBtc190b3QsIG1zX2V4dHIgKSApICU+JSANCiAgbGVmdF9qb2luKHN0b2NrX2VzdGltYWRvICU+JQ0KICAgICAgICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KICAgICAgICAgICAgICAjIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZV9lc3RpbWFkb19ib2xzYXIiKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGZ1ZW50ZV9wcHllID09ICJCb2xzYXIiKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShjb25zdW1vX2tfZmlqbyA9IHZhbG9yICogaXBjXzE4ICogY29uc3Vtb19rX2Zpam9feXBmKSAlPiUgDQogICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgY29uc3Vtb19rX2Zpam8pKSAlPiUgDQogIG11dGF0ZSgNCiAgICAgICAgIyBjcml0ZXJpbyBwcm9waW8NCiAgICAgICAgIHZicF90b3QgPSggKHByb2RfY3J1ZG8qcHJlY2lvX21lX2NydWRvICArIHByb2RfZ2FzICogcHJlY2lvX2V4dGVybm9fZ2FzKSAqIHRjcCkvMTBeNiwNCiAgICAgICAgIHZhX3RvdCA9IHZicF90b3QgLSBjaV9leHRyLA0KICAgICAgICAgZWJlX3RvdCA9IHZhX3RvdCAtIG1zX2V4dHIgLA0KICAgICAgICAgdmJwX2V4dHIgPSAgTkEgLA0KICAgICAgICAgZWJlX2V4dHIgPU5BLA0KICAgICAgICAgdmFfZXh0cj1OQSwgDQogICAgICAgICBmdWVudGUgPSAiQ3JpdGVyaW8gcHJvcGlvIiwgdW5pZGFkID0iTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIgLA0KICAgICAgICAgIHB2ID0gZWJlX3RvdCAtIGNvbnN1bW9fa19maWpvIC0gKHZicF90b3QgKiBpbXBfcHJvbV85NykpDQoNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmZpbHRybyA8LSBjKCJhbmlvIiwgInVuaWRhZCIsICJmdWVudGUiLCAidmJwX3RvdCIsICJ2YnBfZXh0ciIsDQogICAgICAgICAgICAiY2lfdG90IiwgImNpX2V4dHIiLCAgIm1zX3RvdCIsICJtc19leHRyIiwNCiAgICAgICAgICAgICJ2YV90b3QiLCAgInZhX2V4dHIiICwgImViZV90b3QiLCAiZWJlX2V4dHIiICApDQoNCnZhbG9yX3RvdGFsX3Byb2R1Y2Npb25fY29yciA8LSBjY25uX29maWNpYWwgJT4lIA0KICBzZWxlY3QoZmlsdHJvKSAlPiUgDQogICMgcmJpbmQoY3JpdGVyaW9fY2NubiAlPiVzZWxlY3QoZmlsdHJvKSkgJT4lIA0KICByYmluZChlbXBhbG1lX2Njbm4gJT4lIHNlbGVjdChmaWx0cm8pKSAlPiUgDQogIHJiaW5kKGNyaXRlcmlvX3Byb3BpbyAlPiUgc2VsZWN0KGZpbHRybykpICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLCB2YWx1ZT12YWxvciwgNDoxMikgDQoNCnZhbG9yX3RvdGFsX3Byb2R1Y2Npb24gPC0gIHZhbG9yX3RvdGFsX3Byb2R1Y2Npb25fY29yciAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgL2lwY18xOCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikNCg0KDQogIA0KDQpncmFmX3ZhbG9yX3Byb2R1Y2Npb24gPC0gdmFsb3JfdG90YWxfcHJvZHVjY2lvbiAlPiUgDQogIGZpbHRlcihhbmlvID4gMTk2MCkgJT4lIA0KICBnZ3Bsb3QoIGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBmdWVudGUpKSsNCiAgZ2VvbV9saW5lKGFscGhhID0gMC43KSsNCiAgZ2VvbV9wb2ludChzaXplID0gMC40MzUsIGFscGhhID0gMC4yKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiVmFsb3IgZGUgbGEgUHJvZHVjY2nDs24gaGlkcm9jYXJidXLDrWZlcmEiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJWYWxvciB0b3RhbCB5IGNvbXBvbmVudGVzIiwNCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiAgZmFjZXRfd3JhcCh+dmFyaWFibGUpDQpncCA8LSBnZ3Bsb3RseShncmFmX3ZhbG9yX3Byb2R1Y2Npb24sIHdpZHRoID0gNzUwLCBoZWlnaHQgPSA4MDApICANCmdwW1sneCddXVtbJ2xheW91dCddXVtbJ2Fubm90YXRpb25zJ11dW1syXV1bWyd4J11dIDwtIC0wLjExDQpncCAlPiUgbGF5b3V0KG1hcmdpbiA9IGxpc3QobCA9IDc1KSkNCg0KDQpgYGANCg0KDQoNCg0KIyBUYXNhIGRlIEdhbmFuY2lhDQoNCg0KJCRUR197aGlkcm9jYXJidXJvc30gPSBcZnJhY3tQVl97aGlkcm9jYXJidXLDrWZlcmF9fXtLVEFfe2hpZHJvY2FyYnVyw61mZXJvfX0kJA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojbGV2YW50byBkYXRhIHNldHMgZGUgb3RybyBSIG1hcmtkb3duDQpiYWxhbmNlc19hcmcgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy9iYWxhbmNlc19hcmcuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhmZWNoYSA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlWS0lbS0lZCIpLCBYMSA9IGNvbF9za2lwKCkpKQ0KDQpwZXRyb2JyYXNfYXJnX3NlZ21lbnRvcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL3BldHJvYnJhc19hcmdfc2VnbWVudG9zLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkNCg0KeXBmX3NlZ21lbnRvcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL3lwZl9zZWdtZW50b3MuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKQ0KDQpgYGANCg0KIyMgUG9yIGVtcHJlc2ENCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpncmFmX3RnX2VtcCA8LSBiYWxhbmNlc19hcmcgJT4lDQogIGZpbHRlcih0Z19hbnQgIT0gSW5mKSAlPiUgDQogIGdncGxvdChhZXMoZmVjaGEsIHRnX2FudCwgY29sb3IgPSBlbXByZXNhKSkrIA0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGVtcHJlc2FzIGhpZHJvY2FyYnVyb3MiLA0KICAgICAgIHN1YnRpdGxlID0gICJBbnRlcyBkZSBpbXB1ZXN0b3MiKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICBmYWNldF93cmFwKH5zZWN0b3IpDQoNCmdncGxvdGx5KGdyYWZfdGdfZW1wLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCiMjIFBvciBzdWJzZWN0b3INCg0KYGBge3J9DQpiYWxhbmNlc19hcmcgJT4lIA0KICBmaWx0ZXIodW5pZGFkID09ICJNaWxsb25lcyBkZSBwZXNvcyIpICU+JSANCiAgZ3JvdXBfYnkoZmVjaGEsIHNlY3RvcikgJT4lIA0KICBzdW1tYXJpc2UoIlRHIGFudGVzIGRlIGltcHVlc3RvcyIgPSBzdW0oZ2NpYV9hbnQsbmEucm0gPSBUKS9zdW0gKEtUQSxuYS5ybSA9IFQpLA0KICAgICAgICAgIlRHIGRlc3B1ZXMgZGUgaW1wdWVzdG9zIiA9IHN1bShnY2lhX2FudCwgaW1wdWVzdG9fZ2NpYSwgbmEucm0gPSBUKS9zdW0oS1RBLCBuYS5ybSA9IFQgKSApICU+JQ0KICBnYXRoZXIoa2V5ID0gdmFyaWFibGUsIHZhbHVlID0gdmFsb3IsIDM6NCkgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0iVEcgZGVzcHVlcyBkZSBpbXB1ZXN0b3MiKSAlPiUNCiAgZ2dwbG90KGFlcyhmZWNoYSwgdmFsb3IsIGNvbG9yID0gc2VjdG9yKSkrIA0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGVtcHJlc2FzIGhpZHJvY2FyYnVyb3MiLA0KICAgICAgIHN1YnRpdGxlID0gICJBbnRlcyB5IGRlc3B1w6lzIGRlIGltcHVlc3RvcyIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkrDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlKQ0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl90Z195cGYgPC0geXBmX3NlZyAlPiUgDQogICMgZmlsdGVyKHNlY3RvciAlaW4lIGMoInF1aW1pY2EiLCAiZG93bnN0cmVhbSIsICJ1cHN0cmVhbSIpKSAlPiUNCiAgZmlsdGVyKHNlY3RvciAhPSAiYWRtX2NlbnRyYWwiKSAlPiUNCiAgZ2dwbG90KGFlcyhmZWNoYSwgdGdfYWN0aXZvLCBjb2xvciA9IHNlY3RvcikpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgIyBmYWNldF93cmFwKH5zZWN0b3IpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgZ2FuYW5jaWEgZGUgc2VnbWVudG9zIFlQRiIpDQpncmFmX3RnX3lwZg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfdGdfcGV0cm9icmFzIDwtIHBldHJvYnJhc19hcl9zZWcgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICVpbiUgYygicGV0cm9xdWltaWNhIiwgImRvd25zdHJlYW0iLCAidXBzdHJlYW0iLCAiZ2FzX3lfZW5lcmdpYSIpKSAlPiUNCiAgIyBmaWx0ZXIoc2VjdG9yICE9ICJhZG1fY2VudHJhbCIpICU+JQ0KICBnZ3Bsb3QoYWVzKGZlY2hhLCB0ZywgY29sb3IgPSBzZWN0b3IpKSsNCiAgZ2VvbV9saW5lKCkrDQogICMgZmFjZXRfd3JhcCh+c2VjdG9yKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSsNCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGRlIHNlZ21lbnRvcyBQZXRyb2JyYXMgQXJnZW50aW5hIikNCmdyYWZfdGdfcGV0cm9icmFzDQpgYGANCiMjVG90YWwgcmFtYQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICAgLGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD01fQ0KDQp0YXNhX2dhbmFuY2lhX3JhbWEgPC0gZW1wYWxtZV9jY25uICU+JQ0KICBkaXN0aW5jdCgpICU+JSANCiAgICBmaWx0ZXIoYW5pbyA+MTk5NykgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwdikgJT4lIA0KICAgICMgbGVmdF9qb2luKHN0b2NrX3lfcG96b3MgJT4lIA0KICAjICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHB5ZSA9IHBweWVfZXN0aW1hZG8sIHN0b2NrX3NlbGVjY2lvbmFkbyA9IGZ1ZW50ZV9wcHllLCBmdWVudGVfcG96byksDQogICMgICAgICAgICAgIGJ5ID0gYygiYW5pbyIpKSAlPiUgDQogIGxlZnRfam9pbihzdG9ja19lc3RpbWFkbyAlPiUNCiAgICAgICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAsIGJ5ID0gImFuaW8iKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGZ1ZW50ZV9wb3pvID0gIkVzdGltYWNpw7NuIHNpbiBwb3pvcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yID0gdmFsb3IgKmlwY18xOCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHB5ZSA9IHZhbG9yLCBzdG9ja19zZWxlY2Npb25hZG8gPSBmdWVudGVfcHB5ZSwgZnVlbnRlX3Bvem8pLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSANCiAgbXV0YXRlKHRhc2FfZ2FuYW5jaWEgPSBwdi9wcHllKSAlPiUgDQogIGZpbHRlcighaXMubmEoc3RvY2tfc2VsZWNjaW9uYWRvKSkgJT4lIA0KICBzZWxlY3QoLWZ1ZW50ZV9wb3pvKQ0KDQpncmFmX3RnX3JhbWFfMSA8LSB0YXNhX2dhbmFuY2lhX3JhbWElPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCB0YXNhX2dhbmFuY2lhLCBjb2xvciA9c3RvY2tfc2VsZWNjaW9uYWRvICkpKw0KICBnZW9tX2xpbmUoYWxwaGEgPSAwLjUpKw0KICBnZW9tX3BvaW50KCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgZ2FuYW5jaWEgaGlkcm9jYXJidXLDrWZlcmEgY29uIFBQeUUgZGUgZXh0cmFjY2nDs24iKSANCiAgIyBmYWNldF93cmFwKH5zdG9ja19zZWxlY2Npb25hZG8pDQojIGdncGxvdGx5KGdyYWZfdGdfcmFtYV8xLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KZ3JhZl90Z19yYW1hXzENCg0KIyMjIyMjIyMjIyMjDQoNCiMgI2VsIERGIHRhc2FfZ2FuYW5jaWFfcmFtYV9zdG9jayBjb250aWVuZSBsYXMgZXN0aW1hY2lvbmVzIGRpc3RpbnRhcyBlc3RpbWFjaW9uZXMgZGUgS1RBIGNvbiBzdG9jayBkZSBwb3pvcyANCiMgdGFzYV9nYW5hbmNpYV9yYW1hX3N0b2NrIDwtIHZhbG9yX3RvdGFsX3Byb2R1Y2Npb24gJT4lDQojICAgZmlsdGVyKHZhcmlhYmxlID09ICJleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24iICYgZnVlbnRlID09ICJDcml0ZXJpbyBwcm9waW8gY29uIFZCUCBDQ05OIiApICU+JSANCiMgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24gPSB2YWxvcikgJT4lIA0KIyAgIGxlZnRfam9pbihzdG9ja19lc3RpbWFkbyAlPiUgDQojICAgICAgICAgICAgICAgIyBmaWx0ZXIodmFyaWFibGUgJWluJSBjKCJwcHllX2VzdGltYWRvX2FmaXAiLCAicHB5ZV9lc3RpbWFkb19ib2xzYXIiLA0KIyAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAicHB5ZV9lc3RpbWFkb190b3RhbCIpKSAlPiUNCiMgICAgICAgICAgICAgICAjIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZV9lc3RpbWFkb19ib2xzYXIiKSAlPiUNCiMgICAgICAgICAgICAgICAjIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZV9lc3RpbWFkb190b3RhbCIpICU+JQ0KIyAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsICBwcHllID0gdmFsb3IsIHN0b2NrX3NlbGVjY2lvbmFkbyA9IGZ1ZW50ZV9wcHllKSAlPiUgDQojICAgICAgICAgICAgICAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikpICU+JSANCiMgICBtdXRhdGUodGFzYV9nYW5hbmNpYSA9IGV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbi9wcHllKQ0KIyANCiMgZ3JhZl90Z19yYW1hXzIgPC0gdGFzYV9nYW5hbmNpYV9yYW1hX3N0b2NrICU+JSANCiMgICBmaWx0ZXIoYW5pbyA+MTk2MCkgJT4lIA0KIyAgIGdncGxvdChhZXMoYW5pbywgdGFzYV9nYW5hbmNpYSwgY29sb3IgPSBzdG9ja19zZWxlY2Npb25hZG8pKSsNCiMgICBnZW9tX2xpbmUoYWxwaGEgPSAwLjUpKw0KIyAgIGdlb21fcG9pbnQoKSsNCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiMgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwNCiMgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGhpZHJvY2FyYnVyw61mZXJhIGNvbiBQUHlFIGEgcGFydGlyIGRlIHN0b2NrIGRlIHBvem9zICgxOTYwIC0gMjAxOCkiKQ0KIyAjIGdncGxvdGx5KGdyYWZfdGdfcmFtYV8yLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KIyBncmFmX3RnX3JhbWFfMg0KDQpgYGANCg0KIyMgUmVudGEgYXByb3BpYWRhIHBvciBsYXMgZW1wcmVzYXMgZGUgbGEgcmFtYQ0KDQpMYSByZW50YSBhcHJvcGlhZGEgcG9yIGxhcyBlbXByZXNhcyBkZSBsYSByYW1hIHNlIGNhbGN1bGEgcG9yIG1lZGlvIGRlbCBkaWZlcmVuY2lhbCBkZSB0YXNhcyBkZSBnYW5hbmNpYSBlbnRyZSBlbCBzZWN0b3IgaGlkcm9jYXJidXLDrWZlcm8gcXVlIHN1cmdlIGEgcGFydGlyIGRlIGxvcyBiYWxhbmNlcyB5IGxhIHJlbnRhYmlsaWRhZCBub3JtYWwgZGUgbGEgZWNvbm9tw61hLg0KDQokJFJlbnRhXF9lbXByZXNhcyA9IEtUQV97aGlkcm9jYXJidXLDrWZlcm99ICogKFRHX3toaWRyb2NhcmJ1csOtZmVyYX0gLSBUR197cmVmZXJlbmNpYX0pJCQNCiQkVEdfe2hpZHJvY2FyYnVyw61mZXJhfSA9IFxmcmFje0djaWFfe2hpZHJvY2FyYnVyb3N9fXtLVEFfe2hpZHJvY2FyYnVyw61mZXJvfX0kJCANClBvciBsbyBjdWFsLCBsYSByZW50YSBhcHJvcGlhZGEgcG9yIGxhcyBlbXByZXNhcyBkZSBsYSByYW1hIHNlcsOtYSBlcXVpdmFsZW50ZSBhOg0KDQokJFJlbnRhXF9lbXByZXNhcyA9IEdjaWFfe2hpZHJvY2FyYnVyb3N9IC0gS1RBX3toaWRyb2NhcmJ1csOtZmVyb30gKiAgVEdfe3JlZmVyZW5jaWF9JCQNCg0KRG9uZGU6DQoNCiogJEtUQV97aGlkcm9jYXJidXLDrWZlcm99JCA9IFN0b2NrIGRlIGNhcGl0YWwgYWRlbGFudGFkbyBkZSBlbXByZXNhcyBoaWRyb2NhcmJ1csOtZmVyYXMNCiogJFRHX3toaWRyb2NhcmJ1csOtZmVyYX0kID0gVGFzYSBkZSBnYW5hbmNpYSBkZSBlbXByZXNhcyBoaWRyb2NhcmJ1csOtZmVyYXMNCiogJFRHX3tyZWZlcmVuY2lhfSQgPSBUYXNhIGRlIGdhbmFuY2lhIGRlIHJlZmVyZW5jaWENCiogJEdjaWFfe2hpZHJvY2FyYnVyb3N9JCA9IEdhbmFuY2lhIGRlIGVtcHJlc2FzIGhpZHJvY2FyYnVyw61mZXJhcw0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQogIA0KdGdfaW5kdXN0cmlhbCA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1RHL3RnX2luZHVzdHJpYWwuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUgDQogIG11dGF0ZShhbmlvID0gYXMuZG91YmxlKGFuaW8pKQ0KDQpyZW50YV90ZyA8LSAgdGFzYV9nYW5hbmNpYV9yYW1hICU+JQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBzdG9ja19zZWxlY2Npb25hZG8sICBwcHllICwgdGFzYV9nYW5hbmNpYSkgJT4lIA0KICAjIGZpbHRlcihzdG9ja19zZWxlY2Npb25hZG8gPT0gInBweWVfYm9sc2FyIixmdWVudGVfcG96byA9PSAicG96b3NfY2FyZ2Fkb3Nfc2VjX2VuZXJnaWEiICkgJT4lIA0KICBsZWZ0X2pvaW4odGdfaW5kdXN0cmlhbCwgYnkgPSAiYW5pbyIpICU+JSANCiAgcmVuYW1lKHRnX2hpZHJvY2FyYnVyb3MgPSB0YXNhX2dhbmFuY2lhKSAlPiUgDQogIG11dGF0ZSh1bmlvbl90ZyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5MyB+IHRnX2luZHVfamljLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+PSAxOTkzIH4gdGdfaW5kdV9lbSksDQogICAgICAgICByZW50YV9jb25fdGdfamljID0gcHB5ZSAqKHRnX2hpZHJvY2FyYnVyb3MgLSB0Z19pbmR1X2ppYyksDQogICAgICAgICByZW50YV9jb25fdGdfZW0gPSBwcHllICoodGdfaGlkcm9jYXJidXJvcyAtIHRnX2luZHVfZW0pLA0KICAgICAgICAgcmVudGFfY29uX3RnX3VuaW9uID0gcHB5ZSAqKHRnX2hpZHJvY2FyYnVyb3MgLSB1bmlvbl90ZykpICU+JSANCiAgZGlzdGluY3QoKQ0KDQpncmFmX3RnX3JhbWEgPC0gcmVudGFfdGcgJT4lDQogIGZpbHRlcighaXMubmEoc3RvY2tfc2VsZWNjaW9uYWRvKSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiAgICAgICAgIHZhbHVlID0gcmVudGEsDQogICAgICAgICBjKHJlbnRhX2Nvbl90Z19qaWMsIHJlbnRhX2Nvbl90Z19lbSxyZW50YV9jb25fdGdfdW5pb24gKSkgJT4lIA0KICBmaWx0ZXIoYW5pbyA+MTk2MCkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lIA0KICBtdXRhdGUocmVudGEgPSByZW50YS9pcGNfMTgpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCByZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsgDQogIGdlb21fY29sKHBvc2l0aW9uID0iZG9kZ2UiKSsNCiAgIyBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgcG9yIGRpZmVyZW5jaWFsIGRlIHRhc2FzIGRlIGdhbmFuY2lhIiwNCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKyAgZmFjZXRfd3JhcCh+c3RvY2tfc2VsZWNjaW9uYWRvLCBuY29sID0gMSkNCmdncGxvdGx5KGdyYWZfdGdfcmFtYSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnJlbnRhX2VtcHJlc2FzX2JhbGFuY2VzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvcmVudGFfZW1wcmVzYS5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpIA0KDQpyZW50YV9wcm9kdWNjaW9uX2JhbGFuY2VzIDwtICByZW50YV9lbXByZXNhc19iYWxhbmNlcyAlPiUgDQogIGZpbHRlcighKGVtcHJlc2EgJWluJSBjKCJjaGV2cm9uX2dsb2JhbCIsICJwZXRyb2JyYXNfZ2xvYmFsIiApKSwNCiAgICAgICAgIHNlY3RvciAlaW4lIGMoICJpbnRlZ3JhZGEiLCAicHJvZHVjY2lvbiIpDQogICAgICAgICApICU+JSANCiAgZ3JvdXBfYnkoZmVjaGEsIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UoS1RBID0gc3VtKEtUQSwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGdhbmFuY2lhX2VtcHJlc2FzX2FudGVzX2ltcHVlc3RvcyA9IHN1bShnY2lhX2FudCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGdhbmFuY2lhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zID0gc3VtKGdjaWFfZGVzcCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIHJlbnRhX2VtcHJlc2FzX2FudGVzX2ltcHVlc3RvcyA9IHN1bShyZW50YV9hbnRfY29yciwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zID0gc3VtKHJlbnRhX2Rlc3BfY29yciwgbmEucm0gPSBUKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoIGFuaW8gPSBsdWJyaWRhdGU6OnllYXIoZmVjaGEpKSAlPiUgDQogIHNlbGVjdChhbmlvLCBldmVyeXRoaW5nKC4pLCAtZmVjaGEpDQoNCmdyYWZfcmVudGFfZW1wIDwtIHJlbnRhX2VtcHJlc2FzX2JhbGFuY2VzICU+JQ0KICBmaWx0ZXIoc2VjdG9yICE9ICJkaXN0cmlidWNpb24iKSAlPiUgDQogIGZpbHRlcighaXMubmEocmVudGFfZGVzcF9wMTgpLA0KICAgICAgICAgIShlbXByZXNhICVpbiUgYygiY2hldnJvbl9nbG9iYWwiLCAicGV0cm9icmFzX2dsb2JhbCIgKSkpICU+JSANCiAgZ2dwbG90KGFlcyhmZWNoYSwgcmVudGFfZGVzcF9wMTgsIGZpbGwgPSBlbXByZXNhKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAic3RhY2siKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSBwb3IgZW1wcmVzYSIsDQogICAgICAgc3VidGl0bGUgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIpKw0KICBmYWNldF93cmFwKH5zZWN0b3IpDQoNCmdncGxvdGx5KGdyYWZfcmVudGFfZW1wLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KDQpgYGANCg0KDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmVqZXJjaWNpbyA8LSB2YWxvcl90b3RhbF9wcm9kdWNjaW9uICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJ2YV90b3QiKSAlPiUgDQogICMgZnVsbF9qb2luKHN0b2NrX3JhbWEgJT4lDQogICMgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHJhbWEgPSBzZWN0b3IsIGFjdGl2b3MgPSB2YXJpYWJsZSwgdmFsb3JfYWN0aXZvcyA9IHZhbG9yLCANCiAgIyAgICAgICAgICAgICAgICAgICAgZnVlbnRlX2FjdGl2b3MgPSBmdWVudGUpICU+JSANCiAgIyAgICAgICAgICAgICAjIGZpbHRlcihmdWVudGVfYWN0aXZvcyA9PSAiQUZJUCIpKSU+JQ0KICAjICAgICAgICAgICAgIGZpbHRlcihmdWVudGVfYWN0aXZvcyA9PSAiQm9sc2FyIikpJT4lDQogIGZ1bGxfam9pbihzdG9ja19iYWxhbmNlc19lbXByZXNhcyAlPiUNCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGVtcHJlc2EgPT0gIllQRiIpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHJhbWEgPSBzZWN0b3IsIGFjdGl2b3MgPSB2YXJpYWJsZSwgdmFsb3JfYWN0aXZvcyA9IHZhbG9yKSkgJT4lIA0KICAgICAgICAgICAgICAjIGZpbHRlcihmdWVudGVfYWN0aXZvcyA9PSAiQm9sc2FyIikpJT4lDQogIG11dGF0ZShyZWxhY2lvbiA9IHZhbG9yX2FjdGl2b3MvdmFsb3IpICU+JSANCiAgZmlsdGVyKGFuaW8gPiAxOTkwLCAhKGlzLm5hKGFjdGl2b3MpKSkNCmVqZXJjaWNpbyAgICAgICAgICAgIA0KICANCmdyYWZfcmVsYWNpb24gPC0gZWplcmNpY2lvICU+JSANCiAgIyBnZ3Bsb3QoIGFlcyhhbmlvLCByZWxhY2lvbiwgY29sb3IgPSByYW1hKSkrDQogIGdncGxvdCggYWVzKGFuaW8sIHJlbGFjaW9uLCBjb2xvciA9IGZ1ZW50ZSkpKw0KICAjIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIkFjdGl2byBzb2JyZSB2YWxvciBhZ3JlZ2FkbyIpKw0KICBmYWNldF93cmFwKH5hY3Rpdm9zKSANCg0KICBnZ3Bsb3RseShncmFmX3JlbGFjaW9uLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KDQoNCmBgYA0KDQoNCg0KIyBSZW50YSBwb3IgZWwgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBlbnRyZSBlbCBtZXJjYWRvIGludGVybm8geSBsYXMgcmVmZXJlbmNpYXMgaW50ZXJuYWNpb25hbGVzIA0KDQpSZW50YSBhcHJvcGlhZGEgbWVkaWFudGUgZWwgYWJhcmF0YW1pZW50byBlbiBlbCBjb25zdW1vIGludGVybm8gcG9yIGVmZWN0byBkZWwgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vL2V4dGVybm8sIHNvYnJldmFsdWFjacOzbiBkZSBsYSBtb25lZGEgeSByZXRlbmNpb25lcyBhIGxhIGV4cG9ydGFjacOzbg0KDQoNCiMjIyBDcml0ZXJpbyBkZSBjw7NtcHV0byBkZSBKSyAodmFyaWFibGUgJ3JlbnRhX2RpZl9wcmVjaW9zJykNCg0KJCRSRFA9IFByb2RJbnQgKiBQZXh0ICogVENQIC0gUHJvZEludCAqIFBNSSAqIFRDQyQkDQoNCkRvbmRlOg0KDQoqICRSRFAkID0gUmVudGEgYXByb3BpYWRhIHBvciBlZmVjdG8gZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vL2V4dGVybm8geSBzb2JyZXZhbHVhY2nDs24NCiogJE1kb0ludCQgPSBQcm9kdWNjacOzbiBkZXN0aW5hZGEgYWwgTWVyY2FkbyBJbnRlcm5vOiBQcm9kdWNjacOzbiAtIEV4cG9ydGFjaW9uZXMgLSBFeGlzdGVuY2lhcyAoYmFycmlsZXMgZGUgcGV0csOzbGVvIMOzIE1NQlRVKQ0KKiAkUGV4dCQgPSBQcmVjaW8gZGUgcmVmZXJlbmNpYSBkZWwgbWVyY2FkbyBleHRlcm5vIChVU0QpDQoqICRQTUkkID0gUHJlY2lvIGRlIHZlbnRhIGRlbCBtZXJjYWRvIGludGVybm8gKFVTRCkNCiogJFRDUCQgPSBUaXBvIGRlIENhbWJpbyBkZSBQYXJpZGFkDQoqICRUQ0MkID0gVGlwbyBkZSBDYW1iaW8gQ29tZXJjaWFsDQoNCiMjIyBDcml0ZXJpbyBkZSBjw7NtcHV0byBkZSBKSUMgeSBjaWEgKHZhcmlhYmxlICdyZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uJykNCiQkUkRQID0gTWRvSW50ICogUE1JICogKFxmcmFje1RDUH17VENDfSAgLSAxKSQkICANCg0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gPC0gcHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogICMgZmlsdGVyKGFuaW8gPiAxOTkwKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByb2RfY3J1ZG8pICU+JSANCiAgbGVmdF9qb2luKGV4cG9fcV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4cG9fY3J1ZG8pKSAlPiUgI3VuaW9uIGNvbiBleHBvDQogIGxlZnRfam9pbihleGlzdGVuY2lhc19wZXRyb2xlbykgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZXhpc3RlbmNpYXNfY3J1ZG89MCApKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChleHBvX2NydWRvPTAgKSkgJT4lIA0KICAjIG11dGF0ZShwcm9kX21kb19pbnRlcm5vID0gcHJvZF9jcnVkbyAtIGV4cG9fY3J1ZG8gLSBleGlzdGVuY2lhc19jcnVkbykgJT4lIA0KICBtdXRhdGUocHJvZF9tZG9faW50ZXJubyA9IHByb2RfY3J1ZG8gLSBleHBvX2NydWRvICkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19jcnVkb19tZG9pbnQpLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSAgIyB1bm8gY29uIHByZWNpbyBpbnRlcm5vDQogIGxlZnRfam9pbihwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGJyZW50ID0gY2FzZV93aGVuKGFuaW8gPCAxOTg3IH4gYnJlbnRfaGlzdG9yaWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID49IDE5ODcgfiBicmVudF9pZWEgKSkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX21lX2NydWRvLCBicmVudCApLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSAgICMgdW5vIGNvbiBwcmVjaW8gZXh0ZXJubyANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUocmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gPSBwcm9kX21kb19pbnRlcm5vKnByZWNpb19tZV9jcnVkbyp0Y3AgLSBwcm9kX21kb19pbnRlcm5vKnByZWNpb19jcnVkb19tZG9pbnQqdGNjLA0KICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQgPSBwcm9kX21kb19pbnRlcm5vKmJyZW50KnRjcCAtIHByb2RfbWRvX2ludGVybm8qcHJlY2lvX2NydWRvX21kb2ludCp0Y2MsDQogICAgICAgICAjIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24gPSBwcm9kX21kb19pbnRlcm5vICpwcmVjaW9fY3J1ZG9fbWRvaW50KHRjcC90Y2MtMSksDQogICAgICAgICB1bmlkYWRfcHJlY2lvID0gIlVTRCIsIHVuaWRhZF9yZW50YSA9ICJQZXNvcyBjb3JyaWVudGVzIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRpZGFkPSB1bmlkYWQgLCBwcm9kX2NydWRvLCBleHBvX2NydWRvLCBleGlzdGVuY2lhc19jcnVkbywgcHJvZF9tZG9faW50ZXJubywNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8sIHByZWNpb19pbnRlcm5vX2NydWRvID0gcHJlY2lvX2NydWRvX21kb2ludCwgcHJlY2lvX2V4dGVybm9fY3J1ZG8gPSBwcmVjaW9fbWVfY3J1ZG8sDQogICAgICAgICAgdGNjLCB0Y3AsIHVuaWRhZF9yZW50YSwgDQogICAgICAgICAjIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fY3J1ZG8gPSByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uLA0KICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8sIHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50KSANCg0KDQoNCg0KZ3JhZl9kaWZfY3J1ZG8gPC0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gJT4lDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZShyZW50YV9kaWZfcHJlY2lvc19jcnVkbyA9IHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvL2lwY18xOCwNCiAgICAgICAgIHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50ID0gcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQvaXBjXzE4KSAlPiUgDQogIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIHNlbGVjdChhbmlvLCAxMjpuY29sKC4pICkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOjQpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgLyAxMF42KSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIHBldHJvbGVyYSBwb3IgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vIHkgZXh0ZXJubyIsDQogICAgICAgeSA9ICJNTSBkZSBwZXNvcyBkZSAyMDE4IikNCmdyYWZfZGlmX2NydWRvDQoNCg0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgPC0gcHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcm9kX2dhcykgJT4lIA0KICBsZWZ0X2pvaW4oZXhwb19xX2dhc19NTUJUVSAlPiUgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhwb19nYXMpKSAlPiUgDQogIG11dGF0ZShleHBvX2dhcyA9IHJlcGxhY2VfbmEoZXhwb19nYXMsIDAgKSwNCiAgICAgICAgcHJvZF9tZG9faW50ZXJubyA9IHByb2RfZ2FzIC0gZXhwb19nYXMpICU+JQ0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX2dhc19NTUJUVSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8gLCBwcmVjaW9faW50ZXJub19nYXMgPSAgcHJlY2lvX2dhc19tZG9pbnQpLA0KICAgICAgICAgICAgYnkgPSAiYW5pbyIpICU+JSAgIyB1bm8gY29uIHByZWNpbyBpbnRlcm5vDQogIGxlZnRfam9pbihwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fZXh0ZXJub19nYXMpLCANCiAgICAgICAgICAgIGJ5ID0gImFuaW8iKSAlPiUgICAjIHVubyBjb24gcHJlY2lvIGV4dGVybm8NCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lDQogIG11dGF0ZSgNCiAgICBwcmVjaW9faW50ZXJub19nYXMgPSBwcmVjaW9faW50ZXJub19nYXMvIHRjYywNCiAgICByZW50YV9kaWZfcHJlY2lvc19nYXMgPSBwcm9kX21kb19pbnRlcm5vICogdGNwICogcHJlY2lvX2V4dGVybm9fZ2FzDQogICAgICAtIHByb2RfbWRvX2ludGVybm8gKiB0Y2MgKiBwcmVjaW9faW50ZXJub19nYXMgLA0KICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24gPSBwcm9kX21kb19pbnRlcm5vICogcHJlY2lvX2ludGVybm9fZ2FzKih0Y3AvdGNjLTEpLA0KICAgICAgdW5pZGFkX3ByZWNpbyA9ICJVU0QiLCB1bmlkYWRfcmVudGEgPSAiUGVzb3MgY29ycmllbnRlcyIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50aWRhZD0gdW5pZGFkICwgcHJvZF9nYXMsIGV4cG9fZ2FzLCBwcm9kX21kb19pbnRlcm5vLCANCiAgICAgICAgIHVuaWRhZF9wcmVjaW8sIHByZWNpb19pbnRlcm5vX2dhcywgcHJlY2lvX2V4dGVybm9fZ2FzLCB0Y2MsIHRjcCwNCiAgICAgICAgIHVuaWRhZF9yZW50YSwgcmVudGFfZGlmX3ByZWNpb3NfZ2FzLCByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uX2dhcyA9IHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24gKQ0KcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMNCg0KDQoNCmdyYWZfZGlmX2dhcyA8LSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZShyZW50YV9kaWZfcHJlY2lvc19nYXMgPSByZW50YV9kaWZfcHJlY2lvc19nYXMvaXBjXzE4LA0KICAgICAgICAgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMgPSANCiAgICAgICAgICAgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMvaXBjXzE4KSAlPiUNCiAgICBzZWxlY3QoYW5pbywgMTE6bmNvbCguKSApICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMzo0KSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yIC8gMTBeNikgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHRpcG9fcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBnYXPDrWZlcmEgcG9yIGRpZmVyZW5jaWFsIGRlIHByZWNpb3MgaW50ZXJubyB5IGV4dGVybm8iLA0KICAgICAgIHkgPSAiTU0gZGUgcGVzb3MgZGUgMjAxOCIpKw0KICB4bGltKDE5NjAsIDIwMjEpDQpncmFmX2RpZl9nYXMNCg0KDQoNCmBgYA0KDQojIFJlbnRhIGFwcm9waWFkYSBwb3Igc29icmV2YWx1YWNpw7NuIGNhbWJpYXJpYQ0KDQoNCiQkUnNvYnJldmFsdWFjaW9uID0gRXhwbyAqIFBleHQgKiAoVENQIC0gVENDKSQkIA0KDQpEb25kZToNCiogJFJzb2JyZXZhbHVhY2lvbiQgPSBSZW50YSBhcHJvcGlhZGEgcG9yIGV4cG9ydGFjaW9uZXMgY29uIHRpcG8gZGUgY2FtYmlvIHNvYnJldmFsdWFkbw0KKiAkRXhwbyQgPSBFeHBvcnRhY2lvbmVzICAoYmFycmlsZXMgZGUgcGV0csOzbGVvIMOzIE1NQlRVKQ0KKiAkUGV4dCQgPSBQcmVjaW8gZGUgcmVmZXJlbmNpYSBkZWwgbWVyY2FkbyBleHRlcm5vIChVU0QpDQoqICRUQ1AkID0gVGlwbyBkZSBDYW1iaW8gZGUgUGFyaWRhZA0KKiAkVENDJCA9IFRpcG8gZGUgQ2FtYmlvIENvbWVyY2lhbA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQpyZW50YV90Y3BfY3J1ZG8gPC0gIHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvICU+JQ0KICBsZWZ0X2pvaW4oZXhwb191c2RfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19jcnVkb191c2QgPSBleHBvX2NydWRvLCB1bmlkYWRfZXhwbyA9IHVuaWRhZCApKSAlPiUgDQogICBtdXRhdGUocmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gPSBleHBvX2NydWRvKnByZWNpb19leHRlcm5vX2NydWRvKnRjcCAtIGV4cG9fY3J1ZG8qcHJlY2lvX2V4dGVybm9fY3J1ZG8qdGNjLA0KICAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvX3ZhbG9yID0gZXhwb19jcnVkb191c2QqIHRjcCAtIGV4cG9fY3J1ZG9fdXNkKiB0Y2MsIA0KICAgICAgICAgdW5pZGFkX3ByZWNpbyA9ICJVU0QiLCB1bmlkYWRfcmVudGEgPSAiUGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBkaWYgPSByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkby9yZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkb192YWxvci0xKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudGlkYWQgLCBleHBvX2NydWRvLA0KICAgICAgICAgdW5pZGFkX2V4cG8sIGV4cG9fY3J1ZG9fdXNkLA0KICAgICAgICAgdW5pZGFkX3ByZWNpbywgcHJlY2lvX2V4dGVybm9fY3J1ZG8gLA0KICAgICAgICAgIHRjYywgdGNwLCB1bmlkYWRfcmVudGEsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbywgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG9fdmFsb3IsIGRpZikgIA0KcmVudGFfdGNwX2NydWRvDQoNCnJlbnRhX3RjcF9nYXMgPC0gIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzICU+JSANCiAgIG11dGF0ZShyZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMgPSBleHBvX2dhcypwcmVjaW9fZXh0ZXJub19nYXMqdGNwIC0gZXhwb19nYXMqcHJlY2lvX2V4dGVybm9fZ2FzKnRjYywNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8gPSAiVVNEIiwgdW5pZGFkX3JlbnRhID0gIlBlc29zIGNvcnJpZW50ZXMiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudGlkYWQgLCBleHBvX2dhcywgDQogICAgICAgICB1bmlkYWRfcHJlY2lvLCBwcmVjaW9fZXh0ZXJub19nYXMgLA0KICAgICAgICAgIHRjYywgdGNwLCB1bmlkYWRfcmVudGEsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMpICANCg0KDQoNCmBgYA0KDQoNCg0KIyBSZW50YSBhcHJvcGlhZGEgcG9yIGVsIEVzdGFkbyBtZWRpYW50ZSBpbXB1ZXN0b3MgZXNwZWPDrWZpY29zDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCnJldGVuY2lvbmVzX2NhbXBvZG9uaWNvIDwtIHJlYWRfZXhjZWwoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL3JldGVuY2lvbmVzLnhsc3giICwgDQogICAgc2hlZXQgPSAidXNkIikgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsICU+JSBzZWxlY3QoLVRDUCkpICU+JSANCiAgbXV0YXRlKHJldGVuY2lvbmVzX2hjID0gcmV0ZW5jaW9uZXNfaGcgKiBUQ0MgKiAxMDAwMDAwLA0KICAgICAgICAgdW5pZGFkID0gImFycyIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcmV0ZW5jaW9uZXNfaGMpDQoNCnJldGVuY2lvbmVzX2NydWRvIDwtIHJlYWRfZXhjZWwoICIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9yZXRlbmNpb25lcy54bHN4IiApICU+JQ0KICByZW5hbWUocmV0ZW5jaW9uZXNfY3J1ZG9famsgPSByZXRlbmNpb25lc19qaywNCiAgICAgICAgIHJldGVuY2lvbmVzX2NydWRvX2JmciA9ICJyZXRlbmNpb25lc19iZnJfTSQyMDA4IikgJT4lIA0KICBtdXRhdGUocmV0ZW5jaW9uZXNfY3J1ZG9fYmZyID0gcmV0ZW5jaW9uZXNfY3J1ZG9fYmZyICogaXBjMDhfYmZyICogMTAwMCAsDQogICAgICAgICB1bmlkYWQgPSAiYXJzIikgJT4lIA0KICBzZWxlY3QoLWlwYzA4X2JmcikgJT4lIA0KICBsZWZ0X2pvaW4ocmV0ZW5jaW9uZXNfY2FtcG9kb25pY28pDQoNCg0KcmVudGVuY2lvbmVzX3JlZ2FsaWFzIDwtIHJlZ2FsaWFzICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZShyZWdhbGlhc190b3RhbCA9IHN1bShyZWdhbGlhc190b3RhbCwgbmEucm0gPSBUKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmV0ZW5jaW9uZXNfY3J1ZG8gJT4lIHNlbGVjdCgtYyhyZXRlbmNpb25lc19jcnVkb19iZnIsIHJldGVuY2lvbmVzX2hjKSkpIA0KDQoNCg0KcmV0ZW5jaW9uZXNfY3J1ZG8NCg0KDQpgYGANCg0KDQoNCg0KJCRSaW1wID0gUkUgKyBSZWckJA0KDQpEb25kZToNCg0KKiAkUmltcCQgPSBSZW50YSBhcHJvcGlhZGEgcG9yIGVsIEVzdGFkbyBtZWRpYW50ZSBpbXB1ZXN0b3MgZXNwZWPDrWZpY29zDQoqICRSRSQgPSBSZXRlbmNpb25lcw0KKiAkUmVnJCA9IFJlZ2FsaWFzDQoNCiMgUmVudGEgYXByb3BpYWRhIHBvciBjb25zdW1pZG9yZXMgeSByZWZpbmVyw61hcyB5IHByb2Nlc2Fkb3Jhcw0KDQojIyMgQ3JpdGVyaW8gZGUgY8OzbXB1dG8gZGUgUmFtw7NuICgyMDE5KQ0KDQojIyMjIFJlZmluZXLDrWFzIHkgcHJvY2VzYWRvcmFzDQoNCiQkUlIgPSAoUEkgLSBQUk1pKSAqIENydWRvUCQkDQoNCg0KDQoqICRSUiQgPSBSZW50YSBhcHJvcGlhZGEgcG9yIGxhcyBSZWZpbmFkb3JhcyANCiogJFBJJCA9IHByb21lZGlvIHBvbmRlcmFkbyBkZSBQcmVjaW9zIEludGVybmFjaW9uYWxlcyANCiogJFBSTWkkID0gUHJlY2lvIHBvbmRlcmFkbyBhIFJlZmluZXLDrWFzIGRlbCBNZXJjYWRvIEludGVybm8NCiogJENydWRvUCQgPSBiYXJyaWxlcyBkZSBDcnVkbyBQcm9jZXNhZG8gcG9yIGxhcyByZWZpbmFkb3Jhcw0KDQojIyMjIENvbnN1bWlkb3Jlcw0KDQokJFJDID0gKFBJIC0gUFJNaSAtIE1SKSAqIENydWRvUCAkJA0KDQoqICRSQyQgPSBSZW50YSBhcHJvcGlhZGEgcG9yIGxvcyBDb25zdW1pZG9yZXMNCiogJE1SJCA9IE1hcmdlbiBkZSBSZWZpbmVyw61hcw0KDQpFc3RvIHJlc3VsdGEgZXF1aXZhbGVudGUgYSBwbGFudGVhcjoNCg0KJCRSQyA9IFBDTWkgKiBDcnVkb1AkJA0KDQoqICRQQ01pJCA9IFByZWNpbyBwb25kZXJhZG8gYSBDb25zdW1pZG9yZXMgZGVsIE1lcmNhZG8gSW50ZXJuby4NCg0KDQoNCg0KIyBSZW50YSBIaWRyb2NhcmJ1csOtZmVyYSBUb3RhbC4gRW4gcHJlY2lvcyBjb25zdGFudGVzLCBzb2JyZSBQbHVzdmFsw61hIFRvdGFsIHkgUEJJDQoNCkV4aXN0ZW4gZG9zIGNhbWlub3MgcGFyYSBsbGVnYXIgYWwgbW9udG8gdG90YWwgZGUgcmVudGEgZGUgbGEgdGllcnJhIGhpZHJvY2FyYnVyw61mZXJhOiB1bm8gZXMgZGVzY29udGFuZG8gbGEgZ2FuYW5jaWEgbm9ybWFsIGRlIGxhcyBlbXByZXNhcyBhIGxhIHBsdXN2YWzDrWEgdG90YWwgZGVsIHNlY3RvciB5IGVsIG90cm8gZXMgcG9yIG1lZGlvIGRlIGxhIHN1bWEgZGUgbWVjYW5pc21vcyBkZSBhcHJvcGlhY2nDs24uDQoNCiQkUmVudGFcX2hpZHJvY2FyYnVyw61mZXJhID0gUFZfe2hpZHJvY2FyYnVyw61mZXJhfSAtIEdjaWFcX05vcm1hbF97aGlkcm9jYXJidXLDrWZlcmF9JCQNCkRvbmRlOg0KDQoqICRHY2lhXF9Ob3JtYWxfe2hpZHJvY2FyYnVyw61mZXJhfSQgPSBHYW5hbmNpYSBOb3JtYWwgZGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybw0KKiAkUFZfe2hpZHJvY2FyYnVyw61mZXJhfSQgPSBQbHVzdmFsw61hIGRlbCBzZWN0b3IgaGlkcm9jYXJidXLDrWZlcm8gIA0KDQokJEdjaWFcX05vcm1hbF97aGlkcm9jYXJidXLDrWZlcmF9ID0gS1RBX3toaWRyb2NhcmJ1csOtZmVyb30gKiBUR197cmVmZXJlbmNpYX0kJA0KDQoNCkRvbmRlOg0KDQoqICRLVEFfe2hpZHJvY2FyYnVyb3N9JCA9IFN0b2NrIGRlIGNhcGl0YWwgYWRlbGFudGFkbyBkZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvIA0KKiAkVEdfe3JlZmVyZW5jaWF9JCA9IFRhc2EgZGUgZ2FuYW5jaWEgbm9ybWFsIGRlIHJlZmVyZW5jaWEuDQoNCkVuIGVzdGUgY2Fzbywgc2VsZWNjaW9uYW1vcyBsYSB0YXNhIGRlIGdhbmFuY2lhIGRlbCBzZWN0b3IgaW5kdXN0cmlhbCBjb21vIHBhcsOhbWV0cm8gcGFyYSBkaWZlcmVuY2lhciBsYSByZW50YSBkZSBsYSBnYW5hbmNpYS4gQSBzdSB2ZXosIHBhcmEgZWwgY2FwaXRhbCB0b3RhbCBhZGVsYW50YWRvIGRlIGxhcyBlbXByZXNhcyBoaWRyb2NhcmJ1csOtZmVyYXMsIHNlbGVjY2lvbmFtb3MgdW5pY2FtZW50ZSBlbCB2YWxvciByZXN1bHRhbnRlIGRlIGxhIGVzdGltYWNpw7NuIGRlIGxhIFBQeUUgZGUgQm9sc2FyIGEgcGFydGlyIGRlbCBpbmRpY2UgZGUgZmx1am8gZGUgcG96b3MgKHZhcmlhYmxlICJwcHllX2JvbHNhcl9mbHVqbyIpLCBwb3IgbG8gcXVlIGxlIGZhbHRhbiBsb3MgaW52ZW50YXJpb3MgeSBzYWxhcmlvcyBhZGVsYW50YWRvcy4NCg0KRWwgY8OhbGN1bG8gZGUgcmVudGEgdG90YWwgaGlkcm9jYXJidXLDrWZlcmEgcXVlIHNlIG9idGllbmUgcG9yIG1lZGlvIGRlIGRlc2NvbnRhciBsYSBnYW5hbmNpYSBub3JtYWwgYSBsYSBwbHVzdmFsw61hIHRvdGFsIGRlbCBzZWN0b3IsIGRlYmUgc2VyIGlndWFsIGEgbGEgcmVudGEgb2J0ZW5pZGEgcG9yIG1lZGlvIGRlIGxhIGFncmVnYWNpw7NuIGRlIGxvcyBkaXN0aW50b3MgbWVjYW5pc21vcyBkZSBhcHJvcGlhY2nDs24uIEVzIGRlY2lyOg0KDQokJFJlbnRhXF9oaWRyb2NhcmJ1csOtZmVyYSA9IFJlbnRhXF9kaWZlcmVuY2lhbFxfcHJlY2lvcyArIFJlbnRhXF9zb2JyZXZhbHVhY2nDs24gKyBSZW50YVxfZW1wcmVzYXMgKyBJbXB1ZXN0b3NcX25ldG9zXF9lc3BlY8OtZmljb3MgJCQNCiQkSW1wdWVzdG9zXF9uZXRvc1xfZXNwZWPDrWZpY29zID0gUmV0ZW5jaW9uZXMgKyBSZWdhbMOtYXMgLSBTdWJzaWRpb3MkJA0KDQojIyBNw6l0b2RvIGRpcmVjdG8gKGEgcGFydGlyIGRlIGRlc2N1ZW50b3Mgc29icmUgZWwgVkJQKQ0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KIyBrbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz0gVFJVRSxmaWcud2lkdGggPSAxMjAsZmlnLmhlaWdodCA9IDQwMCkNCnJlbnRhX2RpcmVjdG8gPC0gcmVudGFfdGcgJT4lIA0KICBzZWxlY3QoYW5pbywgcHB5ZSAsICNlcyBzdG9jayBkZSBib2xzYXINCiAgICAgICAgIHRnX2hpZHJvY2FyYnVyb3MsIHRnX25vcm1hbCA9IHVuaW9uX3RnKSAlPiUgDQogIGxlZnRfam9pbihjcml0ZXJpb19wcm9waW8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHB2KSApJT4lIA0KICBsZWZ0X2pvaW4oc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MgJT4lIA0KICAgICAgICAgICAgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSwgYnkgPSJhbmlvIikgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShzdWJzaWRpb3MgPSAoc3Vic2lkaW9zX2VqZXMvMTBeNikvaXBjXzE4LCANCiAgICAgICAgICAgICAgICAgICAgIHN1YnNpZGlvcyA9cmVwbGFjZV9uYShzdWJzaWRpb3MsIDApICkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgc3Vic2lkaW9zKSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSwgYnkgPSJhbmlvIikgJT4lIA0KICBtdXRhdGUocmVudGFfY29uX3RnX25vcm1hbCA9IHBweWUqICh0Z19oaWRyb2NhcmJ1cm9zIC0gdGdfbm9ybWFsKSwNCiAgICAgICAgIGdjaWFfbm9ybWFsX2hpZHJvY2FyYnVyb3MgPSBwcHllICogdGdfbm9ybWFsLA0KICAgICAgICAgcmVudGFfdG90YWwgPSAocHYvaXBjXzE4KSAtIGdjaWFfbm9ybWFsX2hpZHJvY2FyYnVyb3MgLXN1YnNpZGlvcywNCiAgICAgICAgICMgcHJvcG9yY2lvbl9zdWJzaWRpb3MgPSBzdWJzaWRpb3MvDQogICAgICAgICAjICAgKHB2IC0gZ2NpYV9ub3JtYWxfaGlkcm9jYXJidXJvcyksDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpICU+JSANCiAgc2VsZWN0KGFuaW8gLCBpcGNfMTgsIHVuaWRhZCwgZXZlcnl0aGluZyguKSwgLXJlbnRhX2Nvbl90Z19ub3JtYWwpICU+JSAjc2FjbyByZW50YV9jb25fdGdfbm9ybWFsIHBvciBubyB1c28NCiAgZmlsdGVyKGFuaW8gPjE5OTcpDQpyZW50YV9kaXJlY3RvDQoNCnJlbnRhX2RpcmVjdG8gJT4lDQogIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgcmVudGFfdG90YWwpKSsgDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIGEgcGFydGlyIGRlIGVzdGltYWNpw7NuIHByb3BpYSBkZWwgVkJQIiwNCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpDQoNCg0KDQpyZW50YV9kaXJlY3RvX3BiaSA8LSByZW50YV9kaXJlY3RvICU+JSANCiAgbGVmdF9qb2luKGdhbmFuY2lhX3lfcGJpICU+JSByZW5hbWUodW5pZGFkX3BiaV9nY2lhID0gdW5pZGFkKSwgIGJ5ID0gImFuaW8iKSAlPiUgDQogICMgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCksICBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUocmVudGFfcHYgPShyZW50YV90b3RhbCppcGNfMTggKS9nYW5hbmNpYSwgDQogICAgICAgICByZW50YV9wYmkgPShyZW50YV90b3RhbCppcGNfMTggKS9wYmkgKQ0KDQoNCmdyYWZfcmVudGFfZGlyZWN0b19wYmkgPC0gcmVudGFfZGlyZWN0b19wYmkgJT4lIA0KICBzZWxlY3QoYW5pbywgcmVudGFfcHYscmVudGFfcGJpICkgJT4lDQogICMgZmlsdGVyKGFuaW8gPj0gMTk2MiwgZnVlbnRlX2djaWEgPT0gIlByb3BpYSIpICU+JQ0KICBmaWx0ZXIoYW5pbyA+PSAxOTYyKSAlPiUNCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjozKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvcikpKw0KICAjIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQogIGdlb21fbGluZSgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCBzb2JyZSBQQkkgeSBHYW5hbmNpYXMgVG90YWxlcyIsDQogICAgICAgc3VidGl0bGUgPSAiQSBwYXJ0aXIgZGUgZXN0aW1hY2nDs24gcHJvcGlhIGRlbCBWQlAiLA0KICAgICAgIHkgPSAiJSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAyKSkrDQogIGZhY2V0X2dyaWQofnRpcG9fcmVudGEgKQ0KDQojIGdyYWZfcmVudGFfZGlyZWN0b19wYmkNCmdncGxvdGx5KGdyYWZfcmVudGFfZGlyZWN0b19wYmksIGhlaWdodCA9IDQwMCwgd2lkdGggPSA2MDApDQoNCmBgYA0KDQoNCiMjIE3DqXRvZG8gaW5kaXJlY3RvIChzdW1hIGRlIG1lY2FuaXNtb3MpDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpyZW50YV9pbmRpcmVjdG8gPC0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gJT4lIA0KICAjIHNlbGVjdChhbmlvLHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvLCByZW50YV9kaWZfcHJlY2lvc19icmVudCApICU+JQ0KICBzZWxlY3QoYW5pbyxyZW50YV9kaWZfcHJlY2lvc19jcnVkbyApICU+JQ0KICBsZWZ0X2pvaW4ocmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgJT4lIHNlbGVjdChhbmlvLCByZW50YV9kaWZfcHJlY2lvc19nYXMpICkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGVuY2lvbmVzX3JlZ2FsaWFzICU+JSBzZWxlY3QoLXVuaWRhZCkgJT4lIA0KICAgICAgICAgICAgICByZW5hbWUocmV0ZW5jaW9uZXMgPSByZXRlbmNpb25lc19jcnVkb19qaykpICU+JSANCiAgbGVmdF9qb2luKHJlbnRhX3RjcF9jcnVkbyAlPiUgc2VsZWN0KGFuaW8sIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGFfdGNwX2dhcyAlPiUgc2VsZWN0KGFuaW8sIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcykpICU+JSANCiAgIGxlZnRfam9pbihzdWJzaWRpb3NfaGlkcm9jYXJidXJvcyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBzdWJzaWRpb3MgPSBzdWJzaWRpb3NfZWplcyksIGJ5ID0iYW5pbyIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbyApICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eCAvIDEwXjZ9KSAlPiUgI2xhcyB2YmxlcyBjYXJnYWRhcyBhbnRlcmlvcm1lbnRlIHNlIHBhc2FuIGEgTU0NCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSByZXBsYWNlX25hKHgsIDApKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGxlZnRfam9pbihyZW50YV90ZyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihzdG9ja19zZWxlY2Npb25hZG8gPT0gIkJvbHNhciIpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfY29uX3RnX3VuaW9uKSApICU+JQ0KICAjIGxlZnRfam9pbihyZW50YV9wcm9kdWNjaW9uX2JhbGFuY2VzICU+JSBzZWxlY3QoYW5pbywgcmVudGFfZW1wcmVzYXMpKSAlPiUNCiAgIyBsZWZ0X2pvaW4ocmVudGFfZGlyZWN0byAlPiUNCiAgIyAgICAgICAgICAgICBmaWx0ZXIoc3RvY2tfc2VsZWNjaW9uYWRvID09ICJwcHllX2JvbHNhciIpICU+JQ0KICAjICAgICAgICAgICAgIHNlbGVjdChhbmlvLCByZW50YV9lbXByZXNhcyA9IHJlbnRhX2Nvbl90Z19ub3JtYWwpICU+JSANCiAgIyAgICAgICAgICAgICBtdXRhdGUocmVudGFfZW1wcmVzYXMgPSAwKSkgJT4lDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYikgJT4lIA0KICBsZWZ0X2pvaW4oZ2FuYW5jaWFfeV9wYmkgJT4lIHJlbmFtZSh1bmlkYWRfcGJpX2djaWEgPSB1bmlkYWQpKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZSgNCiAgICByZW50YV9kaWZfcHJlY2lvc19nYXMgPSByZW50YV9kaWZfcHJlY2lvc19nYXMgL2lwY18xOCwNCiAgICAgICAgIHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvID0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gLyBpcGNfMTgsDQogICAgICAgICAjIHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50ID0gcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQgL2lwY18xOCwNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvID0gcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8vaXBjXzE4LA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzID0gcmVudGFfc29icmV2YWx1YWNpb25fZ2FzL2lwY18xOCwNCiAgICAgICAgIHJlZ2FsaWFzX3RvdGFsID0gcmVnYWxpYXNfdG90YWwgLyBpcGNfMTgsDQogICAgICAgICByZXRlbmNpb25lcyA9IHJldGVuY2lvbmVzIC8gaXBjXzE4LCANCiAgICAgICAgIHN1YnNpZGlvcyA9IHN1YnNpZGlvcy9pcGNfMTgsDQogICAgcmVudGFfZW1wcmVzYXMgPXJlcGxhY2VfbmEocmVudGFfZW1wcmVzYXMsICAwKSwNCiAgICAgICAgIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfZW1wcmVzYXMvaXBjXzE4LA0KICAgICAgICAgcmVudGFfdG90YWwgPSByZW50YV9kaWZfcHJlY2lvc19nYXMrIHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvICsNCiAgICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gKyByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMgKw0KICAgICAgICAgICByZW50YV9lbXByZXNhcysNCiAgICAgICAgICAgcmVnYWxpYXNfdG90YWwgKyAgcmV0ZW5jaW9uZXMgLSBzdWJzaWRpb3MsDQogICAgICAgICBwcm9wb3JjaW9uX3N1YnNpZGlvcyA9IHN1YnNpZGlvcy8ocmVudGFfZGlmX3ByZWNpb3NfZ2FzKyByZW50YV9kaWZfcHJlY2lvc19jcnVkbyArDQogICAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvICsgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzICsNCiAgICAgICAgICAgcmVnYWxpYXNfdG90YWwgKyAgcmV0ZW5jaW9uZXMpICAsDQogICAgICAgICByZW50YV9wdiA9IChyZW50YV90b3RhbCppcGNfMTgpL2dhbmFuY2lhLA0KICAgICAgICAgcmVudGFfcGJpID0gKHJlbnRhX3RvdGFsKmlwY18xOCkvcGJpLA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiLA0KICAgICAgICAgcmVudGFfdXNkX3RjYyA9IChyZW50YV90b3RhbCppcGNfMTgpIC8gdGNjLCANCiAgICAgICAgIHJlbnRhX3VzZF90Y3AgPSAocmVudGFfdG90YWwqaXBjXzE4KSAvIHRjcCwpICAlPiUgDQogIHJlbmFtZShyZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcywNCiAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfY3J1ZG8gPSByZW50YV9kaWZfcHJlY2lvc19jcnVkbywNCiAgICAgICAgICMgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19icmVudCA9IHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50LA0KICAgICAgICAgcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfY3J1ZG8gPSByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyAsDQogICAgICAgICByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMgPSByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMsKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGlwY18xOCx0Y2MsdGNwLCBldmVyeXRoaW5nKC4pICwgLXNvYnJldmFsdWFjaW9uKSAlPiUgDQogICMgc2VsZWN0KC1yZW50YV9kaWZfcHJlY2lvc19jcnVkbykNCiAgIyBzZWxlY3QoLXJlbnRhX2RpZl9wcmVjaW9zX2JyZW50KSAlPiUgDQogIGRpc3RpbmN0KCkNCg0KDQojUmVudGEgdG90YWwNCmdyYWZfcmVudGFfdG90YWwgPC0gcmVudGFfaW5kaXJlY3RvICU+JQ0KICBmaWx0ZXIoYW5pbyA+MTk2MCkgJT4lIA0KICBzZWxlY3QoLWModW5pZGFkLCBpcGNfMTgsIHJlbnRhX3RvdGFsLCB0Y2MsIHRjcCwNCiAgICAgICAgICAgIHN1YnNpZGlvcywgcHJvcG9yY2lvbl9zdWJzaWRpb3MpKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6OCkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHRpcG9fcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrDQogIGdlb21fY29sKHBvc2l0aW9uID0gInN0YWNrIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCAocGV0csOzbGVvIHkgZ2FzKSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkN1cnNvcyBkZSBhcHJvcGlhY2nDs24uIE1pbGxvbmVzIHBlc29zIGRlIDIwMTgiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbih4KSBmb3JtYXQoeCwgYmlnLm1hcmsgPSAiLiIsIHNjaWVudGlmaWMgPSBGQUxTRSkpKw0KICB0aGVtZV9jbGFzc2ljKCkNCg0KZ2dwbG90bHkoZ3JhZl9yZW50YV90b3RhbCwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KIyBwcm9wb3JjaW9uIHN1YnNpZGlvcw0KIyByZW50YV9pbmRpcmVjdG9bLGMoImFuaW8iLCJwcm9wb3JjaW9uX3N1YnNpZGlvcyIpXSAlPiUgYXJyYW5nZSgtYW5pbykNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojUmVudGEgdGNwIHkgdGNjDQpncmFmX3JlbnRhX3RvdGFsX3VzZCA8LSByZW50YV9pbmRpcmVjdG8gJT4lIA0KICBzZWxlY3QoYyhhbmlvLCByZW50YV91c2RfdGNjLCByZW50YV91c2RfdGNwKSkgJT4lDQogIGZpbHRlcihhbmlvID4gMTk2MikgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAyOjMpICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHRpcG9fcmVudGEpICkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCAocGV0csOzbGVvIHkgZ2FzKSIsIA0KICAgICAgIHN1YnRpdGxlID0gIk1pbGxvbmVzIGRlIFVTRCIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbih4KSBmb3JtYXQoeCwgYmlnLm1hcmsgPSAiLiIsIHNjaWVudGlmaWMgPSBGQUxTRSkpDQpnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsX3VzZCwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KDQoNCg0KI2NvbXBhcmFjaW9uIGNvbiBGUg0KZ3JhZl9jb21wYXJhY2lvbl9yZW50YXMgPC0gcmVudGFfaW5kaXJlY3RvICU+JSANCiAgbXV0YXRlKGZ1ZW50ZSA9ICJQcm9waWEgdmlhIHN1bWEgZGUgbWVjYW5pc21vcyIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCxmdWVudGUsICByZW50YV90b3RhbCApICU+JSANCiAgYmluZF9yb3dzKHJlbnRhX2RpcmVjdG9fcGJpICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUoZnVlbnRlID0gIlByb3BpYSB2aWEgZGVzY3VlbnRvcyBzb2JyZSBWQlAiKSAlPiUgDQogICAgICAgICAgICAgICBzZWxlY3QoYW5pbyxmdWVudGUsICByZW50YV90b3RhbCApICkgJT4lIA0KICBiaW5kX3Jvd3MocmVudGFfaGlkcm9jYXJidXJvc19mciAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShmdWVudGUgPSAiRsOhcmZhcm8gUnVpeiB5IEJpbGwiKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZnVlbnRlLCAgcmVudGFfdG90YWwpKSAlPiUgDQogIGZpbHRlcihhbmlvID49IDE5NjIpICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8sIHJlbnRhX3RvdGFsLCBjb2xvciA9IGZ1ZW50ZSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMzUpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgKHBldHLDs2xlbyB5IGdhcykiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJDb21wYXJhY2nDs24gZGUgZXN0aW1hY2lvbmVzLiBNaWxsb25lcyBwZXNvcyBkZSAyMDE4IiwgDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IikrDQogIHRoZW1lX2NsYXNzaWMoKQ0KZ3JhZl9jb21wYXJhY2lvbl9yZW50YXMNCg0KDQojc29icmUgcGJpIHkgcHYNCmdyYWZfcmVudGFfdG90YWxfcHYgPC0gcmVudGFfaW5kaXJlY3RvICU+JSANCiAgc2VsZWN0KGFuaW8sIHJlbnRhX3B2LHJlbnRhX3BiaSApICU+JQ0KICBmaWx0ZXIoYW5pbyA+PSAxOTYyKSAlPiUNCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjozKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB0aXBvX3JlbnRhLCBmaWxsID0gdGlwb19yZW50YSkpKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgc29icmUgUEJJIHkgR2FuYW5jaWFzIFRvdGFsZXMiLA0KICAgICAgIHN1YnRpdGxlID0gIlN1bWEgZGUgbWVjYW5pc21vcyIsDQogICAgICAgeSA9ICIlIikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpwZXJjZW50KQ0KDQoNCmdncGxvdGx5KGdyYWZfcmVudGFfdG90YWxfcHYsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCg0KDQojc29sbyByZW50YSBlbXByZXNhcw0KIyByZW50YV9pbmRpcmVjdG8gJT4lDQojICAgZmlsdGVyKGFuaW8gPiAxOTYwKSAlPiUgDQojICAgbXV0YXRlKHJlbnRhX2VtcHJlc2FzX3B2ID0gcmVudGFfZW1wcmVzYXMqaXBjXzE4L2dhbmFuY2lhLA0KIyAgICAgICAgICByZW50YV9lbXByZXNhc19wYmkgPSByZW50YV9lbXByZXNhcyppcGNfMTgvcGJpKSAlPiUgDQojICAgc2VsZWN0KGFuaW8sIHJlbnRhX2VtcHJlc2FzX3B2LCByZW50YV9lbXByZXNhc19wYmkpICU+JSANCiMgICBnYXRoZXIoa2V5ID0gdmFyaWFibGUsIHZhbHVlID0gdmFsb3IsIDI6MyApICU+JSANCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBmaWxsID0gdmFyaWFibGUpKSsNCiMgICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KIyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiMgICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIGFwcm9waWFkYSBwb3IgZW1wcmVzYXMgc29icmUgUEJJIHkgR2FuYW5jaWFzIFRvdGFsZXMiLA0KIyAgICAgICAgeSA9ICIlIikrDQojICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnQpDQoNCiAgDQpgYGANCg0KDQpgYGB7cn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIHNvbG8gZ2FzDQojIEdhcw0KIyByZW50YV9nYXNfcGJpX3B2IDwtIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzICU+JSANCiMgICBzZWxlY3QoYW5pbyxyZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcywgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMgKSAlPiUgDQojICAgZ3JvdXBfYnkoYW5pbyApICU+JSANCiMgICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHt4IC8gMTBeNn0pICU+JSANCiMgICBsZWZ0X2pvaW4oZ2FuYW5jaWFfeV9wYmkpICU+JSANCiMgICBtdXRhdGUocmVudGFfZGlmX3ByZWNpb3NfZ2FzX3B2ID0gcmVudGFfZGlmX3ByZWNpb3NfZ2FzL2dhbmFuY2lhLA0KIyAgICAgICAgICByZW50YV9kaWZfcHJlY2lvc19nYXNfcGJpID0gcmVudGFfZGlmX3ByZWNpb3NfZ2FzL3BiaSwNCiMgICAgICAgICAgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXNfcHYgPSByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uX2dhcy9nYW5hbmNpYSwNCiMgICAgICAgICAgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXNfcGJpID0gcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMvcGJpLA0KIyAgICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgUGVzb3MgY29ycmllbnRlcyIpDQojIA0KIyBncmFmX3JlbnRhX2dhc19wdiA8LSByZW50YV9nYXNfcGJpX3B2ICU+JSANCiMgICBzZWxlY3QoYW5pbywgNzpuY29sKC4pICkgJT4lIA0KIyAgIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KIyAgICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KIyAgICAgICAgICAyOm5jb2woLikpICU+JSANCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHRpcG9fcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrDQojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiMgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJSZW50YSBwZXRyb2xlcmEgcG9yIGRpZmVyZW5jaWFsIGRlIHByZWNpb3MgaW50ZXJubyB5IGV4dGVybm8gc29icmUgUEJJIHkgR2FuYW5jaWFzIFRvdGFsZXMiLA0KIyAgICAgICAgeSA9ICIlIikNCiMgcGxvdGx5OjpnZ3Bsb3RseShncmFmX3JlbnRhX2dhc19wdikNCmBgYA0KDQojIyBDb3N0b3MNCg0KJCRRXF90b3RhbCA9IFFfe3BldHLDs2xlb30gKyBRX3tnYXN9ICQkDQpEb25kZToNCiAgDQogICogJFFcX3RvdGFsJCA9IENhbnRpZGFkZXMgcHJvZHVjaWRhcyBkZSBwZXRyw7NsZW8geSBnYXMgZW4gQmFycmlsZXMgRXF1aXZhbGVudGVzIGRlIFBldHLDs2xlbw0KICAqICRRX3twZXRyw7NsZW99JCA9IENhbnRpZGFkZXMgcHJvZHVjaWRhcyBkZSBwZXRyw7NsZW8gY3J1ZG8gZW4gYmFycmlsZXMgZXF1aXZhbGVudGVzIGRlIHBldHLDs2xlbyAoQk9FKQ0KICAqICRRX3tnYXN9JCA9IENhbnRpZGFkZXMgcHJvZHVjaWRhcyBkZSBnYXMgbmF0dXJhbCBlbiBiYXJyaWxlcyBlcXVpdmFsZW50ZXMgZGUgcGV0csOzbGVvIChCT0UpDQogIA0KDQokJCBDb3N0b3NcX3RvdGFsZXMgPSAgQ0kgKyBNUyArIENvbktmaWpvJCQNCg0KRG9uZGU6DQoNCiogJENvc3Rvc1xfdG90YWxlcyQgPSBDb3N0b3MgdG90YWxlcyBoaWRyb2NhcmJ1csOtZmVyb3MNCiogJENJJCA9IENvbnN1bW8gSW50ZXJtZWRpbywgZGlzdGludGFzIGVzdGltYWNpb25lcw0KKiAkTVMkID0gTWFzYSBTYWxhcmlhbCwgZGlzdGludGFzIGVzdGltYWNpb25lcw0KKiAkQ29uS2Zpam8kID0gQ29uc3VtbyBkZSBDYXBpdGFsIEZpam8NCg0KDQokJENvc3Rvc1xfdG90YWxlc1xfY29uXF9HY2lhID0gQ29zdG9zXF90b3RhbGVzICsgR2NpYVxfTm9ybWFsX3toaWRyb2NhcmJ1csOtZmVyYX0gJCQNCkRvbmRlOg0KDQoqICRDb3N0b3NcX3RvdGFsZXNcX2NvblxfR2NpYSQgPSBDb3N0b3MgdG90YWxlcyBoaWRyb2NhcmJ1csOtZmVyb3MgY29uIGdhbmFuY2lhIG5vcm1hbCANCiogJEdjaWFcX05vcm1hbF97aGlkcm9jYXJidXLDrWZlcmF9JCA9IEdhbmFuY2lhIG5vcm1hbCBkZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvDQoNCiQkIFByZWNpb1xfY29zdG8gPSBcZnJhY3tDb3N0b3NcX3RvdGFsZXN9e1FcX3RvdGFsfSAgICQkDQpEb25kZToNCiogJFByZWNpb1xfY29zdG8kID0gUHJlY2lvIGRlIGNvc3RvIGVuIEJPRQ0KDQpBIHBhcnRpciBkZSBlc3RvIHNlIHB1ZWRlIGNhbGN1bGFyIHVuIGNvc3RvIHJlY3VwZXJhYmxlIGRlbCBwZXRyw7NsZW8geSBkZWwgZ2FzDQoNCiQkQ29zdG9cX2NydWRvID0gUV97cGV0csOzbGVvfSAqIFByZWNpb1xfY29zdG8kJA0KJCRDb3N0b1xfZ2FzID0gUV97Z2FzfSAqIFByZWNpb1xfY29zdG8kJA0KDQoNCiQkUHJlY2lvXF9wcm9kdWNjaW9uID0gXGZyYWN7Q29zdG9zXF90b3RhbGVzXF9jb25cX0djaWF9e1FcX3RvdGFsfSQkDQoNCiQkUHJlY2lvXF92dGFcX3BvdGVuY2lhbCA9ICBcZnJhY3tRXF90b3RhbCpQZXh0X3twZXRyw7NsZW99IC0gQ29zdG9zXF90b3RhbGVzfXtRXF90b3RhbH0gJCQNCg0KDQpEb25kZToNCiogJFByZWNpb1xfcHJvZHVjY2lvbiQ9IFByZWNpbyBkZSBwcm9kdWNjaW9uDQoqICRQcmVjaW9fdnRhX3BvdGVuY2lhbCQgPSBQcmVjaW8gZGUgdmVudGEgcG90ZW5jaWFsDQoqICRQZXh0X3twZXRyw7NsZW99JCA9IFByZWNpbyBkZSBleHBvcnRhY2nDs24vcmVmZXJlbmNpYSBpbnRlcm5hY2lvbmFsIGRlbCBwZXRyw7NsZW8gY3J1ZG8NCg0KYGBge3J9DQojZXN0aW1hY2lvbiBjb3N0b3MgcHJvcGlhDQpjb3N0b3MgPC0gcHJvZHVjY2lvbl90b3RhbCAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWRfcHJvZHVjY2lvbj11bmlkYWQsDQogICAgICAgICBwcm9kdWNjaW9uX2NydWRvID1wcm9kX2NydWRvLCBwcm9kdWNjaW9uX2dhcz1wcm9kX2dhcywNCiAgICAgICAgIHByb2R1Y2Npb25fdG90YWw9cHJvZHVjY2lvbl90b3RhbF9iZXApICU+JSANCiBsZWZ0X2pvaW4oc3RvY2tfZXN0aW1hZG8gJT4lDQogICAgICAgICAgICAgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQogICAgICAgICAgICAgICMgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllX2VzdGltYWRvX2JvbHNhciIpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGNvbnN1bW9fa19maWpvID0gdmFsb3IgKiBpcGNfMTggKiBjb25zdW1vX2tfZmlqb195cGYpICU+JSANCiAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBjb25zdW1vX2tfZmlqbykpICU+JQ0KICBsZWZ0X2pvaW4odmFsb3JfdG90YWxfcHJvZHVjY2lvbiAlPiUgDQogICAgICAgICAgICAgIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogICAgICAgICAgICAgIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KC1zb2JyZXZhbHVhY2lvbikpICU+JQ0KICAgICAgICAgICAgICBmaWx0ZXIodmFyaWFibGUgJWluJSBjKCJjaV9leHRyIiwgIm1zX2V4dHIiKSwNCiAgICAgICAgICAgICAgICAgICAgIGZ1ZW50ZSVpbiUgYygiQ0NOTiBvZmljaWFsIiwgIkVtcGFsbWUgQ0NOTiIpKSAlPiUgIyJDcml0ZXJpbyBDQ05OIg0KICAgICAgICAgICAgICBtdXRhdGUodmFsb3IgPSAodmFsb3IqMTBeNikqaXBjXzE4L3RjYywNCiAgICAgICAgICAgICAgICAgICAgIHVuaWRhZCA9IlVTRCB0Y2MiKSAlPiUgDQogICAgICAgICAgICAgIHNwcmVhZChrZXk9dmFyaWFibGUsIHZhbHVlPXZhbG9yKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGFfZGlyZWN0byAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAjc3RvY2tfc2VsZWNjaW9uYWRvLA0KICAgICAgICAgICAgICAgICAgICAgcHB5ZSwgdGdfbm9ybWFsLCByZW50YV90b3RhbCkgKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX3JlZmVyZW5jaWFfZXh0ZXJubyA9IHByZWNpb19tZV9jcnVkbykpICU+JSANCiAgbXV0YXRlKHBweWUgPSAocHB5ZSoxMF42KSppcGNfMTgvdGNjLA0KICAgICAgICAgcmVudGFfdG90YWwgPSAocmVudGFfdG90YWwqMTBeNikqaXBjXzE4L3RjYywNCiAgICAgICAgIHVuaWRhZF9jb3N0b3M9ICJVU0QvYm9lIiwNCiAgICAgICAgIGNvc3Rvc190b3RhbGVzID0gKGNpX2V4dHIgK21zX2V4dHIgKyBjb25zdW1vX2tfZmlqbyksDQogICAgICAgICBjb3N0b3NfdG90YWxlc19zdW1fZ2NpYV9ub3JtYWwgPSBjb3N0b3NfdG90YWxlcyArIChwcHllICAqIHRnX25vcm1hbCksDQogICAgICAgICBwcmVjaW9fY29zdG8gPSBjb3N0b3NfdG90YWxlcy9wcm9kdWNjaW9uX3RvdGFsLA0KICAgICAgICAgcHJlY2lvX2Nvc3RvX21tYnR1ID0gY29udmVyc29yX2JlcE1NQlRVX3AocHJlY2lvX2Nvc3RvKSwNCiAgICAgICAgIHByZWNpb19wcm9kdWNjaW9uID1jb3N0b3NfdG90YWxlc19zdW1fZ2NpYV9ub3JtYWwvcHJvZHVjY2lvbl90b3RhbCwNCiAgICAgICAgIHByZWNpb192ZW50YV9wb3RlbmNpYWwgPSAocHJvZHVjY2lvbl90b3RhbCAqcHJlY2lvX3JlZmVyZW5jaWFfZXh0ZXJubyAtDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdG9zX3RvdGFsZXMpL3Byb2R1Y2Npb25fdG90YWwgKQ0KICAgICAgICAgIyBwcmVjaW9fdmVudGFfcG90ZW5jaWFsID0gKChwcHllICogdGdfbm9ybWFsKStyZW50YV90b3RhbCkvcHJvZHVjY2lvbl90b3RhbCkNCiMgKHByb2R1Y2Npb24geCBwcmVjaW8gaW50ZXJuYWNpb25hbCAtIGNvc3Rvc190b3RhbGVzKSAvIGJhcnJpbGVzIEJPRSA9IGdjaWEgKyByZW50YSBwb3IgYmFycmlsIA0KI2V4cHJlc2FyIGVuIHVzZCB0Y2MgeSB0Y3ANCmNvc3Rvcw0KDQpjb3N0b3MgJT4lIA0KICAgICAgICAgICBmaWx0ZXIoYW5pbyA+IDE5OTcpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCBwcmVjaW9fY29zdG8sIGNvbG9yID0gZnVlbnRlKSkrIA0KICBnZW9tX2xpbmUoYWxwaGEgPSAwLjUsIHNpemUgPSAxLjQpKw0KICAgIGxhYnModGl0bGUgPSAiUHJlY2lvIGRlIGNvc3RvIiwNCiAgICAgICAgIHN1YnRpdGxlPSAiRXN0aW1hY2lvbiBwcm9waWEgYSBwYXJ0aXIgZGUgQ0NOTiB5IHJlZXN0aW1hY2lvbiBkZSBWQlAgY29uIGNyaXRlcmlvIENDTk4iLCANCiAgICAgICAgIHkgPSAiVVNEL0JPRSIsIHggPSAiQcOxbyIpDQoNCg0KYGBgDQoNCiMgQ29tcGFyYWNpw7NuIGNvbiBlc3RpbWFjacOzbiBkZSBvdHJvcyBhdXRvcmVzDQoNCmBgYHtyfQ0KDQojcmVudGEgdXNkIHZzIGF1dG9yZXMNCiNmYWx0YSBhZ3JlZ2FyIHJlbnRhX2hpZHJvY2FyYnVyb3NfamsNCnJlbnRhX2F1dG9yZXMgPC0gcmVudGFfaW5kaXJlY3RvICU+JSANCiAgc2VsZWN0KGFuaW8sdGNjLCB0Y3AsIGlwY18xOCwgcmV0ZW5jaW9uZXMsIHJlZ2FsaWFzX3RvdGFsLCBjb250YWlucygicmVudGEiKSkgJT4lIA0KICBzZWxlY3QoIC0oMTM6bmNvbCguKSkpICU+JSANCiAgZmlsdGVyKGFuaW8gPiAxOTYyKSAlPiUNCiAgbXV0YXRlKCByZXRlbmNpb25lcz0gcmV0ZW5jaW9uZXMqaXBjXzE4L3RjYywgICAgICAgDQogICAgICAgICAgcmVnYWxpYXNfdG90YWwgPSByZWdhbGlhc190b3RhbCppcGNfMTgvdGNjLCANCiAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbyppcGNfMTgvdGNwLA0KICAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMqaXBjXzE4L3RjcCwNCiAgICAgICAgICByZW50YV9leHBvX3NvYnJldmFsdWFkYV9jcnVkbyA9IHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvKmlwY18xOC90Y3AsICANCiAgICAgICAgICByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMgPSByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMqaXBjXzE4L3RjcCAgLA0KICAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uID0gcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfY3J1ZG8rIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2dhcywNCiAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zID0gDQogICAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcysgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbywNCiAgICAgICAgICAjIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfZW1wcmVzYXMqaXBjXzE4L3RjYywNCiAgICAgICAgICAjIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfZW1wcmVzYXMqaXBjXzE4L3RjYywNCiAgICAgICAgICByZW50YV90b3RhbCA9IChyZW50YV90b3RhbCppcGNfMTgpIC8gdGNwLA0KICAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiLA0KICAgICAgICAgYXV0b3IgPSAiUHJvcGlhIikgJT4lIA0KICByZW5hbWUocmV0ZW5jaW9uZXMgPSByZXRlbmNpb25lcywNCiAgICAgICAgIHJlZ2FsaWFzID0gcmVnYWxpYXNfdG90YWwNCiAgICAgICAgICAjIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfZW1wcmVzYXMsDQogICAgICAgICAjIHJlbnRhX3RvdGFsX2dhcyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzLA0KICAgICAgICAgIyByZW50YV90b3RhbF9jcnVkbyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfY3J1ZG8sDQogICAgICAgICApICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgYXV0b3IsIGV2ZXJ5dGhpbmcoLiksIA0KICAgICAgICAgLWMoaXBjXzE4LCB0Y2MsIHRjcCwgcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfY3J1ZG8sIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2dhcywNCiAgICAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzLCByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvKSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19kZV9yZW50YSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICA0Om5jb2woLikpICU+JSANCiAgICBiaW5kX3Jvd3MocmVudGFfYXV0b3JlcykNCiMjIyMjDQoNCg0KI2dyYWZpY28gY29tcGFyYWNpb24gY29uIG90cm9zIGF1dG9yZXMNCmdyYWZfdGlwb3NfcmVudGEgPC0gcmVudGFfYXV0b3JlcyAlPiUgDQogIGZpbHRlcighKHRpcG9fZGVfcmVudGElaW4lIGMoInJlbnRhX3RvdGFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW50YV9lc3RhZG9fdG90YWwiKSkpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBhdXRvcikpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludChzaXplID0gMC41KSsNCiAgZmFjZXRfd3JhcCh+dGlwb19kZV9yZW50YSwgc2NhbGVzID0gImZyZWVfeSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIGVzdGltYWNpb25lcy4gTWlsbG9uZXMgVVNEIiwgDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KZ2dwbG90bHkoZ3JhZl90aXBvc19yZW50YSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkgIA0KDQoNCg0KZ3JhZl9yZW50YV90b3RhbF9jb21wYXJhY2lvbiA8LSByZW50YV9hdXRvcmVzICU+JSANCiAgIyBmaWx0ZXIoIShhdXRvciA9PSAiUHJvcGlhIiAmIHRpcG9fZGVfcmVudGEgPT0gInJlbnRhX3RvdGFsIikpICU+JQ0KICAjIG11dGF0ZSh0aXBvX2RlX3JlbnRhPSBjYXNlX3doZW4odGlwb19kZV9yZW50YSA9PSJyZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zIiAmDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9yID09ICJQcm9waWEiIH4gInJlbnRhX3RvdGFsIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB0aXBvX2RlX3JlbnRhKSkgJT4lDQogIGZpbHRlcih0aXBvX2RlX3JlbnRhID09ICJyZW50YV90b3RhbCIpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBhdXRvcikpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgKHBldHLDs2xlbyB5IGdhcykiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJDb24gcmVudGEgdG90YWwgcHJvcGlhIG1ldG9kb2xvZ8OtYSBhdXRvcmVzIiwgDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkNCmdyYWZfcmVudGFfdG90YWxfY29tcGFyYWNpb24NCg0KZ2dwbG90bHkoZ3JhZl9yZW50YV90b3RhbF9jb21wYXJhY2lvbiwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCiMgZ2dwbG90bHkoZ3JhZl9yZW50YV90b3RhbF9jb21wYXJhY2lvbl9iKQ0KDQpgYGANCg0KDQoNCiMgRXhwb3J0YWNpb24gZGUgcmVzdWx0YWRvcw0KDQpgYGB7cn0NCg0KI3JhdyBkYXRhIGZvciBtZXRhZGF0YQ0KZGF0b3MgPC0gIGxpc3QoIHByb2RfbWVyZ2VfY3J1ZG8sIHByZWNpb19taV9jcnVkbywgZXhwb19xX2NydWRvLCBwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvLCBwcm9kX21lcmdlX2dhc19NTUJUVSwgDQogICBwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkLCAgZXhwb19xX2dhcywgIHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSwgc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MsDQogICBnYW5hbmNpYV95X3BiaSwgdGNwX2FudWFsX2IsIGlwY19wcm9tZWRpbyAsIHJlbnRhX2luZGlyZWN0b1ssYygxOjEzLCAxNyldLCByZW50YV9kaWZfcHJlY2lvc19jcnVkb1ssLTE0XSwgDQogcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXNbLC0xM10sIHJlbnRhX3RjcF9jcnVkb1ssLWMoMTI6MTMpXSwgcmVudGFfdGNwX2dhcywgcmVnYWxpYXNfdXNkLCByZXRlbmNpb25lc19jcnVkbywgc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MsIA0KIHJlbnRhX3Byb2R1Y2Npb25fYmFsYW5jZXMgLCBjcml0ZXJpb19wcm9waW8sIHJlbnRhX2RpcmVjdG8sIHJlbnRhX2RpcmVjdG9fcGJpWyxjKDEsMTQ6MTUpXSwgDQogcmVudGFfaW5kaXJlY3RvWyxjKDEsMTk6MjApXSwgIGNjbm5fb2ZpY2lhbCwgY3JpdGVyaW9fY2NubiwgZW1wYWxtZV9jY25uLCBjcml0ZXJpb19wcm9waW8sIA0KcmVudGFfYXV0b3JlcywgcmVudGFfZW1wcmVzYXNfYmFsYW5jZXMsICBzdG9ja19iYWxhbmNlc19lbXByZXNhcywgdW5pb25fc2VnbWVudG9zLCBjb3N0b3MpDQoNCiMjIHZhcmlhYmxlcyBkZSB0b2RvcyBsb3MgZGF0YWZyYW1lcw0KY29sdW1uYXMgPC0gYygpDQpmb3IoaSBpbiAxOmxlbmd0aChkYXRvcykpew0KICBjb2x1bW5hcyA8LSBjKGNvbHVtbmFzLCBjb2xuYW1lcyhkYXRvc1tbaV1dKSkNCn0NCg0KbGlzdF9jb2wgPC0gIGFzLmRhdGEuZnJhbWUodW5pcXVlKGNvbHVtbmFzKSkNCg0KDQojIHggPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCJjb2x1bW5hcy54bHN4IikgJT4lIA0KIyAgICMgcmVuYW1lKHZhcmlhYmxlID0gInVuaXF1ZShjb2x1bW5hcykiKSAlPiUgDQojICAgbXV0YXRlKHVuaWRhZCA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KHZhcmlhYmxlLCByZWdleCgiZ2FzfGJvbGl2aWEiKSkgICYgc3RyX2RldGVjdCh2YXJpYWJsZSwgcmVnZXgoInByZWNpb3xwcmljZSIpKSB+ICJVU0QvTU1CVFUiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdCh2YXJpYWJsZSwgcmVnZXgoImdhc3xsbmciKSkgICYgc3RyX2RldGVjdCh2YXJpYWJsZSwgcmVnZXgoInByb2QiKSkgfiAiTU1CVFUiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdCh2YXJpYWJsZSwgcmVnZXgoImNydWRvfHBldHJvbGVvIikpICAmIHN0cl9kZXRlY3QodmFyaWFibGUsIHJlZ2V4KCJwcmVjaW8iKSkgfiAiVVNEL0JhcnJpbCIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KHZhcmlhYmxlLCByZWdleCgiY3J1ZG98cGV0cm9sZW8iKSkgfiAiQmFycmlsZXMiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdCh2YXJpYWJsZSwgcmVnZXgoImNydWRvfHBldHJvbGVvIikpICAmIHN0cl9kZXRlY3QodmFyaWFibGUsIHJlZ2V4KCJwcm9kfGV4cG8iKSkgfiAiQmFycmlsZXMiKSkNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQojIHdyaXRleGw6OndyaXRlX3hsc3goeCwgcGF0aCA9ICAiY29sdW1uYXMueGxzeCIpDQoNCmBgYA0KDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojIyBFeHBvcnRhY2nDs24gZGUgcmVzdWx0YWRvcw0KDQp3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QocHJvZHVjY2lvbl9jcnVkbyA9IHByb2RfbWVyZ2VfY3J1ZG8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbnRlcm5vX2NydWRvID0gcHJlY2lvX21pX2NydWRvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRhY2lvbl9jcnVkbyA9IGV4cG9fcV9jcnVkbywgDQogICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvc19leHRlcm5vX2NydWRvID0gcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNjaW9uX2dhcyA9IHByb2RfbWVyZ2VfZ2FzX01NQlRVLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9faW50ZXJub19nYXMgPXByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGFjaW9uX2dhcyA9IGV4cG9fcV9nYXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHRlcm5vX2dhcyA9IHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzaWRpb3MgPXN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGdhbmFuY2lhX3lfcGJpID0gZ2FuYW5jaWFfeV9wYmksDQogICAgICAgICAgICAgICAgICAgICAgICAgdGlwb19jYW1iaW8gPSB0Y3BfYW51YWxfYiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBpcGMgPSBpcGNfcHJvbWVkaW8pLA0KICAgICAgICAgICAgICAgICAgICBwYXRoID0gICIuLi9yZXN1bHRhZG9zL2FyZ2VudGluYS92YXJpYWJsZXMueGxzeCIpDQoNCmNvZWZpY2llbnRlcyA8LSBsaXN0KCJQcm9wb3JjacOzbiBkZSBsb3Mgc2VydmljaW9zIHNvYnJlIGV4dHJhY2Npb24iID0gc2VydmljaW9fc19leHRyYWNjaW9uLA0KICAgICAgICAgICAgICAgICAgICAgIlRhc2EgZGUgZGVwcmVjaWFjacOzbiBkZSBZUEYiID0gY29uc3Vtb19rX2Zpam9feXBmLA0KICAgICAgICAgICAgICAgICAgICAgIkltcHVlc3RvcyBwcm9tZWRpb3MgTUlQIDk3IiA9IGltcF9wcm9tXzk3LA0KICAgICAgICAgICAgICAgICAgICAgIkNvZWZpY2llbnRlIHRlY25pY28gTUlQIDk3IiA9IGNvZWZfdGVjbmljb185NywNCiAgICAgICAgICAgICAgICAgICAgICJQcm9wb3JjacOzbiBkZSBsYSBNYXNhIFNhbGFyaWFsIHRvdGFsIHByb21lZGlvIDIwMDQtMjAxMiI9IG1lYW5fY29lZl9tcyRjb2VmX21zX3RvdCwNCiAgICAgICAgICAgICAgICAgICAgICJQcm9wb3JjacOzbiBkZSBsYSBNYXNhIFNhbGFyaWFsIGV4dHJhY2Npb24gcHJvbWVkaW8gMjAwNC0yMDEyIj0gbWVhbl9jb2VmX21zJGNvZWZfbXNfZXh0ciwNCiAgICAgICAgICAgICAgICAgICAgICJDb2VmaWNpZW50ZSBjb25zdW1vIGludGVybWVkaW8gKEHDsW8pIiA9Y29lZl9jb25zdW1vX2ludGVybWVkaW8kYW5pbywNCiAgICAgICAgICAgICAgICAgICAgICJDb2VmaWNpZW50ZSBjb25zdW1vIGludGVybWVkaW8gKDEtIFZBL1ZCUCkiID1jb2VmX2NvbnN1bW9faW50ZXJtZWRpbyRjb2VmX2NpKQ0KY2FwdHVyZS5vdXRwdXQoY29lZmljaWVudGVzLCBmaWxlID0gIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL2NvZWZpY2llbnRlcy50eHQiKQ0KDQpjb3N0b3NfY29tcGFyYWNpb24gPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCIuLi9yZXN1bHRhZG9zL2FyZ2VudGluYS9jb3N0b3MueGxzeCIpDQp3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3Qoc3VtX21lY2FuaXNtb3MgPSByZW50YV9pbmRpcmVjdG9bLGMoMToxMywgMTcpXSAlPiUgZmlsdGVyKGFuaW8gPjE5NjEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2N1ZW50b3NfdmJwID0gcmVudGFfZGlyZWN0bywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzb2JyZV9waWJfZGVzY3VlbnRvcyA9IHJlbnRhX2RpcmVjdG9fcGJpWyxjKDEsMTQ6MTUpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBzb2JyZV9waWJfbWVjYW5pc21vcyA9cmVudGFfaW5kaXJlY3RvWyxjKDEsMTk6MjApXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZG9fZGlmX3ByZWNpb3MgPSByZW50YV9kaWZfcHJlY2lvc19jcnVkb1ssLTE0XSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZ2FzX2RpZl9wcmVjaW9zID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXNbLC0xM10sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkb19zb2JyZXZhbHVhY2lvbiA9IHJlbnRhX3RjcF9jcnVkb1ssLWMoMTI6MTMpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhc19zb2JyZXZhbHVhY2lvbiA9IHJlbnRhX3RjcF9nYXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgcmVnYWxpYXMgPSByZWdhbGlhc191c2QsDQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0ZW5jaW9uZXMgPSByZXRlbmNpb25lc19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzaWRpb3MgPSBzdWJzaWRpb3NfaGlkcm9jYXJidXJvcywNCiAgICAgICAgICAgICAgICAgICAgICAgICB0Z190b3RhbCA9cmVudGFfdGcsDQogICAgICAgICAgICAgICAgICAgICAgICAgdGdfZW1wcmVzYXMgPSByZW50YV9lbXByZXNhc19iYWxhbmNlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdG9ja19iYWxhbmNlcyA9IHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRvX1lQRl9QZXRCUiA9dW5pb25fc2VnbWVudG9zLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNjbm5fb2ZpY2lhbCA9IGNjbm5fb2ZpY2lhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb19jY25uPWNyaXRlcmlvX2Njbm4gJT4lIHNlbGVjdCgtYyhjaV90b3QgLCBjaV9leHRyKSkgLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGVtcGFsbWVfY2Nubj1lbXBhbG1lX2Njbm4sDQogICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9fcHJvcGlvID1jcml0ZXJpb19wcm9waW8gLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmFjaW9uX2F1dG9yZXMgPSByZW50YV9hdXRvcmVzICwgDQogICAgICAgICAgICAgICAgICAgICAgICAgY29zdG9zX2NvbXBhcmFjaW9uID0gY29zdG9zX2NvbXBhcmFjaW9uICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdG9zX2Njbm49Y29zdG9zKSwNCiAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICIuLi9yZXN1bHRhZG9zL2FyZ2VudGluYS9yZW50YV9kZV9sYV90aWVycmFfaGlkcm9jYXJidXJpZmVyYV9hcmcueGxzeCIpDQpgYGANCg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KeCA8LSByZW50YV9hdXRvcmVzICU+JSANCiAgZmlsdGVyKGFuaW8gPjE5OTcsdGlwb19kZV9yZW50YSA9PSJyZW50YV90b3RhbCIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkLCBhdXRvcikgJT4lIA0KICAjIHN1bW1hcmlzZSh2YWxvciA9IHN1bSh2YWxvciwgbmEucm0gPSBUKSkgJT4lIA0KICBzcHJlYWQoa2V5ID0gYXV0b3IsIHZhbHVlID0gdmFsb3IpICAlPiUgDQogIG11dGF0ZSh2YXJpYWJsZSA9ICJSZW50YSBkZSBsYSB0aWVycmEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgZGUgQXJnZW50aW5hIiApICU+JSANCiAgc2VsZWN0KCBhbmlvLCB1bmlkYWQsIHZhcmlhYmxlLCBldmVyeXRoaW5nKC4pLCAtdGlwb19kZV9yZW50YSkNCg0Kd3JpdGV4bDo6d3JpdGVfeGxzeCh4LCBwYXRoID0gIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL3RhYmxhX2NvbXBhcmFjaW9uX2F1dG9yZXMueGxzeCIpDQoNCg0KIyBFeHBvcnRhY2lvbiB2aWVqYQ0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QobWV0b2RvX2luZGlyZWN0byA9IHJlbnRhX2luZGlyZWN0b1ssYygxOjEzLCAxNyldLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZG9fZGlmX3ByZWNpb3NfbXMgPSByZW50YV9kaWZfcHJlY2lvc19jcnVkb1ssLTE0XSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGdhc19kaWZfcHJlY2lvc19tcyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzWywtMTNdLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkb19zb2JyZXZhbHVhY2lvbl9tcyA9IHJlbnRhX3RjcF9jcnVkb1ssLWMoMTI6MTMpXSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FzX3NvYnJldmFsdWFjaW9uX21zID0gcmVudGFfdGNwX2dhcywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2FsaWFzID0gcmVnYWxpYXNfdXNkLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ZW5jaW9uZXMgPSByZXRlbmNpb25lc19jcnVkbywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNpZGlvcyA9IHN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVudGFfYmFsYW5jZXMgPSByZW50YV9wcm9kdWNjaW9uX2JhbGFuY2VzICApLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAiLi4vcmVzdWx0YWRvcy9hcmdlbnRpbmEvcmVudGFfbWV0b2RvX2luZGlyZWN0by54bHN4IikNCiMgDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdCh2YV9jcml0ZXJpb19wcm9waW8gPSBjcml0ZXJpb19wcm9waW8sDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0b2RvX2RpcmVjdG8gPSByZW50YV9kaXJlY3RvKSwNCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL3JlbnRhX21ldG9kb19kaXJlY3RvLnhsc3giKQ0KIyANCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KCBtZXRvZG9fZGlyZWN0b19wYmkgPSByZW50YV9kaXJlY3RvX3BiaVssYygxLDE0OjE1KV0sDQojICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRvZG9faW5kaXJlY3RvX3BiaT1yZW50YV9pbmRpcmVjdG9bLGMoMSwxOToyMCldKSwNCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL3JlbnRhX3NvYnJlX3BiaS54bHN4IikNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoY2Nubl9vZmljaWFsID0gY2Nubl9vZmljaWFsLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9fY2Nubj1jcml0ZXJpb19jY25uLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wYWxtZV9jY25uPWVtcGFsbWVfY2NubiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvX3Byb3BpbyA9Y3JpdGVyaW9fcHJvcGlvKSwNCiMgICAgICAgICAgICAgICAgICAgICBwYXRoPSAiL0FyY2hpdm9zL3JlcG9zL2hpZHJvY2FyYnVyb3MvYW5hbGlzaXMvcmVzdWx0YWRvcy9hcmdlbnRpbmEvdmFsb3JfdG90YWxfcHJvZHVjY2lvbi54bHN4IikNCiMgDQojIA0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoY29tcGFyYWNpb25fYXV0b3JlcyA9IHJlbnRhX2F1dG9yZXMpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvcmVudGFfY29tcGFyYWNpb25fYXV0b3Jlcy54bHN4IikNCiMgDQojIA0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoIHRnX3RvdGFsID1yZW50YV90ZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJyZW50YSBlbXByZXNhcyIgPSByZW50YV9lbXByZXNhc19iYWxhbmNlcywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvY2tfYmFsYW5jZXMgPSBzdG9ja19iYWxhbmNlc19lbXByZXNhcywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRvX1lQRl9QZXRCUiA9dW5pb25fc2VnbWVudG9zKSwgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2FyZ2VudGluYS9zdG9jaywgdGcgeSByZW50YSBlbXByZXNhcyBhcmdlbnRpbmEueGxzeCIpDQojIA0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoY29zdG9zX2Njbm49Y29zdG9zKSwNCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvYXJnZW50aW5hL2Nvc3Rvc19jY25uLnhsc3giKQ0KDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KHByb2R1Y2Npb24gPSBwcm9kX21lcmdlX2NydWRvLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGFjaW9uZXMgPSBleHBvX3FfY3J1ZG8sDQojICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGVuY2lhcyA9IGV4aXN0ZW5jaWFzX3BldHJvbGVvLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbnRlcm5vID0gcHJlY2lvX21pX2NydWRvLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHRlcm5vID0gcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcCA9IHRjcF9hbnVhbF9iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsbyA9IHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvKSwgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL3JlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfY3J1ZG8ueGxzeCIpDQojIA0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QocHJvZHVjY2lvbiA9IHByb2RfbWVyZ2VfZ2FzX01NQlRVLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGFjaW9uZXMgPSBleHBvX3FfZ2FzX01NQlRVLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2ludGVybm8gPSBwcmVjaW9fbWlfZ2FzX01NQlRVLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHRlcm5vID0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwID0gdGNwX2FudWFsX2IsDQojICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxvID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMpLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMueGxzeCIpDQojICMgDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdCgiY29uIHBvem9zIHBlcmZvcmFkb3MgcG9yIGHDsW8iPSBzdG9ja19lc3RpbWFkbywgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uIHN0b2NrIGRlIHBvem9zIiA9IGVqZXJjaWNpb19mZF9zdG9jaywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICJhIHBhcnRpciBZUEYgKGZsdWpvKSIgPSBlamVyY2ljaW9fZmRfeXBmKSwgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2VzdGltYWNpb24gZGUgc3RvY2sgYSBwYXJ0aXIgZGUgcG96b3MueGxzeCIpDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KCJjb24gcG96b3MgcGVyZm9yYWRvcyBwb3IgYcOxbyI9IHN0b2NrX3lfcG96b3MpLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvZXN0aW1hY2lvbiBkZSBzdG9jayBhIHBhcnRpciBkZSBwb3pvcy54bHN4IikNCg0KIyANCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KCJmbHVqbyI9IGNvbXBhcmFjaW9uX3Bvem9zLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgImZsdWpvX3RvdGFsIj0gbGlzdGFkb19wb3pvcywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICJzdG9jayIgPSBwb3pvc19pYXBnX2NlbnRlbmFyaW8pLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvYXJnZW50aW5hL3Bvem9zLnhsc3giKQ0KIyANCiMgDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdChhZmlwID0gc3RvY2tfYWZpcCwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VzX2JvbHNhciA9IHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudG9fWVBGX1BldEJSID11bmlvbl9zZWdtZW50b3MsDQojICAgICAgICAgICAgICAgICAgICAgICAgICBib2xzYXJfdjIgPSBzdG9ja19iYWxhbmNlc19yYW1hLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgImludmVyc2lvbiBwb3IgcG96byAoSUFQRykiID0gaW52ZXJzaW9uX3Bvem9zLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZlcnNpb24gcG9yIHBvem8gKENhcCBJVikiPSBpbnZlcnNpb25fcG96b3NfY2FwaXYpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvc3RvY2tfcGV0cm9sZW8ueGxzeCIpDQojIA0KDQoNCg0KcHJpbnQoIkVsIGPDs2RpZ28gdGVybWluw7MgZGUgY29ycmVyIikNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg==